C ++プログラムのFilenameコマンドライン引数からのフルパスをどのように決定しますか?

StackOverflow https://stackoverflow.com/questions/2033908

質問

私は、コマンドラインの引数としてファイル名を受け入れるC ++でプログラムを書いています。

>> ./myprogram ../path/to/file.txt

FSTREAMを使用して単純に開くことができることを知っています argv[1], 、しかし、プログラムには、ファイルの正確な場所(つまりフルパス名)に関する詳細情報が必要です。

私はアプリをすることを考えました argv[1]getcwd(), 、しかし明らかに上記の例では、あなたは /path/../path/to/file.txt. 。 FSTREAMがそのパスを自動的に解決するかどうかはわかりませんが、たとえそれがそうであっても、文字列処理があまりないフルパスはまだありません。

もちろん、提供されたパスがすでに絶対的であった場合、その方法はまったく機能しません。また、このプログラムはLinux/Windows/etcで実行される可能性があるため、開始 '/'キャラクターを検出するだけでは、引数がフルパスであるかどうかを判断するために機能しません。

これは、複数のOSのパス名を処理するためのかなり一般的な問題だと思います。そう コマンドライン引数のフルパス名をどのように再取得しますかこれはオペレーティングシステム間でどのように処理されますか?

役に立ちましたか?

解決

PathNameの取り扱いは非常にOS固有です。一部のOSには、1つのルート(EG / UNIX)だけの階層があり、一部にはMS-DOSのドライブ文字にいくつかのルーツがあります。象徴的なリンク、ハードリンク、または他の種類のリンクを持っている人もいれば、横方向にトリッキーになる可能性があります。ファイルへの「標準的な」パスの概念さえ持っていない人もいます(たとえば、ファイルにハードリンクがある場合、複数の名前があり、どれも「標準的」ではありません)。

Javaの複数のOSでパス名操作をしようとしたことがあるなら、あなたは私が何を意味するか知っています:-)。

要するに、PathNameの取り扱いはシステム固有であるため、各OS(ファミリ)に対して個別に実行するか、適切なライブラリを使用する必要があります。

編集:

あなたは見ることができます Apacheポータブルランタイム, 、またはBoost(C ++)では、両方ともパス名の処理関数があります。

他のヒント

... /path/../path/to/file.txtになります。 FSTREAMがそのパスを自動的に解決するかどうかはわかりませんが、たとえそれがそうであっても、文字列処理があまりないフルパスはまだありません。

それはそうであり、あなたは問題なくあなたが望むすべてに/path/../path/を使用することができます。

とにかく、C ++には、必要なことを行う標準関数はありません。あなたは手動でそれをしなければならないでしょう、そしてそれは些細なことではありません。私はあなたがそれがそのままのように道を維持することを提案することを提案します、それは問題を引き起こすべきではありません。

それはos依存です。 Linuxを使用している場合は、見ることができます realpath(). 。間違いなく、Windowsには匹敵するものがあります。

afaik標準的な方法はありません。

ただし、このアプローチを試すことができます(Pseudocodeで書かれています):

string raw_dirname=get_directory_part(argv[1])
string basename=get_filename_part(argv[1])
string cwd=getcwd()
chdir(relative_dirname)
string absolute_dirname=getcwd()
chdir(cwd)
string absolute_filename=absulute_dirname + separator + basename

しかし、注:象徴的なリンクが作用するときに問題があるかどうかはよくわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top