2012-06-14 17 views
13

GNU/Linux上のC/C++の特定の相対パスからファイルまたはディレクトリの絶対パスを特定するにはどうすればよいですか?
私は約realpath()を知っていますが、存在しないファイルでは動作しません。ファイルやディレクトリの絶対パスを取得する方法*存在しない*存在しない?

ユーザーが../non-existant-directory/file.txtと入力し、プログラム作業ディレクトリが/home/user/とします。
私が必要とするのは、/home/non-existant-directory/file.txtを返す関数です。

特定のパスが特定のサブディレクトリにあるかどうかをチェックするには、この関数が必要です。

+0

このようなものは組み込まれていないと思います。コードを自分で書く必要があります。 –

答えて

10

お試しrealpathです。失敗した場合は、一度に最後からパスコンポーネントを削除し、成功するまでrealpathを再試行してください。次に、削除したコンポーネントを成功したrealpath呼び出しの結果に追加します。

ディレクトリが存在し、そこにファイルを作成するだけであれば、最大で1つのコンポーネントを削除するだけで済みます。

もう1つの方法は、ファイルを作成してからを作成してから、realpathを呼び出します。

+0

最初の解決策がありました、ありがとう! –

0

あなたは現在のディレクトリを取得し、次のロジックに適用できます。パスは「/」で始まる場合、相対パス上に述べた各ディレクトリのルート

でカレントディレクトリを置き換え

を行います以下:あなたは、相対パスの最後の部分にある場合

  • は、カレントディレクトリのパスに追加して停止:カレントディレクトリのパスが絶対パスです。

  • それ以外の場合:現在のディレクトリの下にそのようなディレクトリが存在するかどうかを確認します。

  • それが存在しますが、ディレクトリではない、信号エラー(パスの最後のエントリがない限り)

  • を、それが存在しない場合、それがディレクトリである、それはシンボリックリンク(あるかどうかを確認しなければこの機能をサポートするOSで)。表示されている場合は、現在のディレクトリをシンボリックリンクの指定されたディレクトリに置き換えます。それは存在しない、それがディレクトリではなく、シンボリックリンクであればそうでない場合は

  • 、(すなわちチェックするサブディレクトリにカレントディレクトリを置き換え)

  • をカレントディレクトリのパスにこのディレクトリを追加存在する場合は、相対パスの残りの部分をカレントディレクトリのパスに追加して停止します。

+2

これは本質的に 'realpath'を自分自身で再実装しており、必要以上に多くの作業をしています。 –

関連する問題