• ベストアンサー

物理的に同じファイルを指しているかを調べる方法。

こんにちは。Windowsでプログラムをしています。 二つのファイル名の文字列があるときに、そのファイルがディスク内の同じファイルを指しているかどうか判定する方法はないでしょうか? 実行ファイルと同じドライブであれば、相対パスから判定できる思っていますが、ジャンクション機能(linkd.exeやmklink.exe)で別のドライブでマウントされてしまうと、どうやって判定してよいのか分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

1. 対象の2つのファイルを開きます。 2. GetFileInformationByHandleを呼び出します。 3. ファイルを閉じます。 4. BY_HANDLE_FILE_INFORMATIONのdwVolumeSerialNumber,nFileIndexHigh,nFileIndexLowを比較します。 4ですべてが等しければ同じファイル,異なれば別のファイルです。 ただし,ネットワーク上のファイルに対しては,同一のファイルを別のファイルと判定する場合があるようです (過去に経験した事があります)。 なお,対象自体がリパースポイント (Junction/Symbolic Link) の場合にどう判定したいかによって,CreateFileの呼び出し方に影響が出ます。 ・リパースポイントを解決した結果のファイル (つまりはリンク先のファイル) を比較したい場合 FILE_FLAG_OPEN_REPARSE_POINTを使わずに開く ・リパースポイント自体を比較したい場合 FILE_FLAG_OPEN_REPARSE_POINTを付けて開く なお,FILE_FLAG_OPEN_REPARSE_POINTは対象がリパースポイントでなければ無視されるので,後者の場合は常に付けてしまって問題ないです。

shuuden
質問者

お礼

こんにちは。 GetFileInformationByHandlという関数は初めて知りました。 ネットワーク上のファイルについて自分で確認を取って事例を見つけてみたいと思います。 非常に詳しく解説して頂いてありがとうございました。

関連するQ&A