0

コマンドラインでファイル名を引数として受け入れるプログラムをc ++で作成しています。

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

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

argv[1]に追加することを考えgetcwd()ましたが、上記の例では明らかに/path/../path/to/file.txt. fstream がそのパスを自動的に解決するかどうかはわかりませんが、解決したとしても、多くの文字列処理を行わないと完全なパスを取得できません。

もちろん、指定されたパスがすでに絶対パスである場合、その方法はまったく機能しません。また、このプログラムは Linux/Windows/etc で実行される可能性があるため、開始文字「/」を検出するだけでは、引数がフル パスであるかどうかを判断することはできません。

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

4

4 に答える 4

3

パス名の処理は OS に大きく依存します。OS によっては、ルートが 1 つだけの階層を持つものもあれば (Unix の / など)、MS-DOS のドライブ文字のように複数のルートを持つものもあります。一部には、シンボリック リンク、ハード リンク、またはその他の種類のリンクが含まれている場合があり、トラバーサルが難しくなる可能性があります。ファイルへの「正規」パスの概念さえ持たないものもあります (たとえば、ファイルにハード リンクがあり、複数の名前があり、どれも「正規」ではない)。

Java で複数の OS 間でパス名操作を試みたことがある場合は、私の言いたいことがわかるでしょう :-)。

つまり、パス名の処理はシステム固有であるため、OS (ファミリ) ごとに個別に行うか、適切なライブラリを使用する必要があります。

編集

Apache Portable Runtime、または Boost (ただし C++) を見ることができますが、どちらにもパス名処理関数があります。

于 2010-01-09T16:08:14.927 に答える
1

OSに依存します。Linuxを使用している場合は、realpath()を確認できます。間違いなく、Windowsには同等のものがあります。

于 2010-01-09T16:18:47.853 に答える
1

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

ただし、このアプローチ(擬似コードで記述)を試すことができます。

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

ただし、注意:シンボリックリンクが機能するときに問題が発生するかどうかはよくわかりません。

于 2010-01-09T16:19:14.643 に答える
1

... /path/../path/to/file.txt になります。fstream がそのパスを自動的に解決するかどうかはわかりませんが、解決したとしても、多くの文字列処理を行わないと完全なパスを取得できません。

そうであり、必要なものすべてに問題なく /path/../path/ を使用できます。

とにかく、C++ には、やりたいことを行うための標準関数はありません。手動で行う必要があり、簡単ではありません。パスをそのままにしておくことをお勧めします。問題は発生しません。

于 2010-01-09T16:02:55.453 に答える