0

短縮版

ディレクトリの1つがシンボリックリンクであるパスから解決されたパスを取得するにはどうすればよいですか:

例:

path = /x/y/d/f1 とします。ここで、y は /a/b へのシンボリック リンクです。

したがって、解決されたファイル パスの結果は次のようになります: /x/a/b/d/f1

ロングバージョン

dir1 から dir2 にファイルをコピーする C++ 関数を書きたいと思います (もちろん、これは実際の問題ではなく、より大きく複雑な問題の軽減です)。

コピー プロセスの前に、dir1 からコピーされる dir2 のすべてのファイルを削除したいと思います。私が持っているとしましょう:

  • Dir1 = /a/b/c/d
  • Dir2 = /x/y/d/

dir1 にファイル 'f1' があり、dir2 にファイル 'f1' があると仮定すると、私のプロセスは次のようになります。

  1. /x/y/d/f1 を削除
  2. /a/b/c/d/f1 を /x/y/d/f1 にコピー

私の問題は次のとおりです。

dir 'y' が /a/b/c/ へのシンボリック リンクであるとします。/x/y/d/f1 を削除すると、実際には /a/b/c/d/f1 が削除されます。(私の例には穴があるかもしれませんが、アイデアが得られることを願っています)

これを回避したいのですが、つまり、/x/y/d/f1 を削除するときに、/x/y/d/f1 を削除することを知り、その削除をスキップできるようにしたいのです。

POSIX readlink() 関数を使用してみましたが、ファイル 'f1' 自体がシンボリック リンクの場合にのみ機能しますが、親ディレクトリの 1 つがシンボリック リンクの場合は機能しません。

何か案は?

4

2 に答える 2

1

次のリンクで答えが得られます。

http://ubuntuforums.org/showthread.php?t=1126617

次のコードを使用して、symilnk を解決できます。

char buf[512];
int count = readlink("/x/y/d", buf, sizeof(buf));
if (count >= 0) {
    buf[count] = '\0';
    printf("%s -> %s\n", argv[1], buf);
}

上記のコードでは、「d」パス コンポーネントはシンボリック リンクである必要があります。そのため、各パス コンポーネントを反復して解決する必要があります。

于 2015-01-02T06:44:53.490 に答える
0

上記の衝突シナリオを回避したいだけの場合は、カナリア ファイルを作成し、別の構築されたパスを介してアクセスを試みる方が簡単です。一般的な質問を意味する場合、フルディレクトリ操作について。

明確でない場合: /x/y/d/TEMP123456 を作成すると、実際に同じディレクトリを指している場合、/a/b/c/d/TEMP123456 (またはその逆) として表示されます。

単一のファイルの場合は、さらに簡単な場合があります。ターゲットディレクトリで削除する前に、ソースファイルを排他アクセス用に開きます。(NFSシステムをミックスに追加した場合、それがどれほど信頼できるかはわかりません。)

于 2013-07-01T09:22:32.300 に答える