2012-03-12 79 views
2

シンボリックリンクの絶対パスをlinuxのc言語で指定されたディレクトリ(リンクされたファイルを含む)に基づいてどのように相対パスに変換できるか知りたいのですが(Ubuntu )OS。linuxの絶対パスを相対パスに変換する方法

私は相対パスの部分文字列を探していましたが、既にフォルダの階層の上位に存在する場合はどうなりますか?ここで

私が何をしたいのかをより具体的に説明する: 相対パス:

folder/folder1/folder2 

アブソルートパス:

私はカント明らか
/home/giorgos/Desktop/myfolder/folder1/folder2/a.pdf 

に変更

/home/giorgos/Desktop/folder/folder1/folder2/a.pdf 

'単純に「folder /」を検索して置き換えます。この場合は次のように考えてください:

/home/giorgos/Desktop/folder/folder/folder/folder1/folder2/a.pdf 

それは後方前方との両方を検索することができ、交換した場合、それはまだ私が後方絶対に検索し、それを置き換えることができ、相対パスを知っていた場合にのみ、出力は正しいだろう間違った出力に を与える:

相対パスを変換
/home/giorgos/Desktop/folder/myfolder/folder/folder1/folder2/a.pdf 
+1

なく実行されますか?カレントディレクトリ? –

+0

はい、現在のディレクトリの相対ディレクトリ、私はより具体的にしようとします –

+1

私はこれを行う一般的な、あらかじめ書かれたコードを知っていません。この問題の背景は何ですか?必ずしもこのルートに向かない良い解決策があるかもしれません。 – sarnold

答えて

1

私はこのツールを書いていたのですが、絶対的なシンボリックリンクは、ファイルシステム内のどこかに移動したときに同じ値を持たなければならない - ユーザは非常に特定のファイルを望んでいた。そして、相対的なシンボリックリンクは、ファイルシステム内のどこかに移動したときに同じ値を持たなければなりません。ユーザは、ディレクトリツリーがどこに根付いていたかにかかわらず、リンクが動作することを望みました。

しかし、2つのタイプのリンクが混在していれば、あなたはもっとやるべきことがあります。これは今あなたがいると思います。

rsync(1) はあなたが使用できるいくつかのソースコードを持っているかもしれません - ;(あなただけreadlink(2)symlink(2)正確にファイルシステムが言う、あなたのプログラムが意外になることはありません場合は、Unixのプログラムは、多くの場合、ユーザの意図を推測に関することを許容しません。) - または少なくともから学ぶ。 --safe-linksコマンドラインオプションを指定すると、rsyncは、の絶対シンボリックリンクと、コピーが指示されたツリーの外側を指し示す相対的なシンボリックリンクを無視します。これはあなたが望むように相対化するためのパスを標準化するのではありませんが、問題のディレクトリツリーの外側を指しているリンクを発見するのに十分なコードを提供するかもしれません。

やや関連性があります。 Linux固有のsymlinkat(2)システムコールは、シンボリックリンクの作成を容易にします。(...at()システムコールのファミリは、あなた自身ですべてのfchdir(2)呼び出しを行うことなく、複数の「現在の作業ディレクトリ」を持つプロセスを提供するようなものです。)

+0

ありがとう、私は見ています。実際は今のところ私はディレクトリツリー外のシンボリックリンクには興味がありません –

3

まず多くの基地原子が二つの経路の間で共有されている方法を見て、正しいブランチをダウンナビゲートする前にツリーまで後方に移動する../挿入の問題です。 IEは:/foo/bar/some/pathから/foo/other/pathに移動すると、最初に/ fooを共有していることがわかります.3 /に必要なポイントまで上に移動し、相対パスを/foo/../../../other/pathにします。 boost :: filesystemの例はC++ hereのため、C++ & boost :: filesystemのために保存してください。同じことがC言語でできます。

+0

まだ/ foo/bar/one/fooそしてあなたはfoo/bar/one/foo/onemoreに行くつもりです、そして、あなたは最初に出会ったfooで止まります。私は正しいですか? –

+0

いいえ、あなたは続けます。上記の例では、最初のものから2番目のものに進む場合は、最初のものの全体が2番目のものと共通であることがわかります。その結果は単にonemoreです。アトムは、ディレクトリツリー全体で一意である必要はありません。アトム自体は、パスのUIDであるブランチです。 – Ylisar

0

まあ最初は重要な情報として、私は関数の助けを借りて、元のディレクトリとコピーディレクトリへの絶対パスを見つけました。

この方法で、最終的に元のフォルダの "相対パス"(元のフォルダから始まるパス)を取得できます。dirのツリー名のルートノードをコピーしたフォルダに変更し、コピーしたフォルダの絶対パスを取得し、 "相対的な道"とそれはそれでした!

realpath(directory,absolutePath); 

これは私のコードは次のようになります。

readlink(A[i].str, oldLink, NAMESIZE);//A is the struct I keep the paths to directory entries 
k=0; 
j=strlen(absolutPath); 
while(oldLink[j]!='\0') 
{ 
    fixLink[k]=oldLink[j]; 
    j++; 
    k++; 
} 
strcpy(tmpLink,newAbsolutPath); 
strcat(tmpLink,fixLink); 
symlink (tmpLink,tmpPath);//tmpPath is the name of the link, tmp link is the absolute path to the actual file 
//tmpPath is built almost the same way 

これまでのところ、それは何に相対バグ

関連する問題