1

ハードリンクを解決せずにフォルダ全体をコピーしたい

例:

Folder1
  |
  +---File1
      File2
      HardLink3 -> File3

fsutil hardlink create(またはを使用して作成されたHardLink3 mklink

このフォルダをコピーしたい

Folder2
  |
  +---File1
      File2
      HardLink3 -> File3

Folder2\HardLink3をFile3を指すハードリンクとして保持します

このセマンティクスを使用してフォルダー全体をコピーするWin32API呼び出しはありますか、またはファイルごとにCopyFile / CreateHardLinkを実行する必要がある場合、特定のファイルがハードリンクであるかどうかを確認するAPI呼び出しは何ですか?

4

2 に答える 2

2

これがあなたのやりたいことであると絶対に確信している場合、ファイルに複数のリンクがあるかどうか(つまり、「ハードリンク」)を判断する最も簡単な方法はおそらくGetFileInformationByHandleです。

返されるnNumberOfLinks値は、通常のファイルの場合は1になり、ファイルがハードリンクである(またはある)場合は1より大きくなります。

あなたのシナリオを正しく理解していれば、ファイルが特定のファイルセット(「共有フォルダー」内のファイル)の1つにハードリンクされているかどうかを確認する方が、ファイルにハードリンクされているかどうかを確認する方が賢明かもしれません。どこでも。これを行うには、ハードリンクの場合は元のファイルの場合と同じファイルID(nFileIndexHighおよび)を確認します。nFileIndexLow

後者の場合、最適化として、1回の操作で特定のディレクトリ内のすべてのファイルの名前とファイルIDを読み取るオプションをGetFileInformationByHandleEx使用できます。FileIdBothDirectoryInfo

于 2011-09-16T03:53:12.697 に答える
2

必要なことを一度に実行するためのWin32API呼び出しはないと思うので、おそらくこれを手動で実行する必要があります。

ファイルがハードリンクであるかどうかを確認することは、おそらくあなたがしたいことではありません。ファイルがシンボリックリンク、ディレクトリ(または再解析ポイントまたはその他のあいまいなもの)でない場合、それは実際にはハードリンクです。つまり、ファイルの名前はディスクに保存されているファイルを指します。したがって、2つのファイルが同じデータを指している場合、それらは両方ともそのファイルへのハードリンクです。

とにかく、ファイルへのすべてのハードリンクを列挙するWin32メソッドは、FindFirstFileNameWとFindNextFileNameWです。

于 2011-09-14T17:21:52.813 に答える