• ベストアンサー
  • 困ってます

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

こんにちは。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は対象がリパースポイントでなければ無視されるので,後者の場合は常に付けてしまって問題ないです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • 相対パスのショートカットでファイルを実行する設定法

    Windows10ですが、ショートカットでリンクして実行ファイルを起動したいと思います。 アイコン化したリンクファイルをクリックすると、同じフォルダにあるサブのフォルダ\programの下のa.exeを実行したいとします。リンクファイルのショートカットのプロパティで、 リンク先./program/a.exe あるいは、.\program\a.exe 作業フォルダ./programあるいは.\program などと、相対的に指定したいのですが、できません。絶対パスではもちろん通るのですが。そのリンクの絶対パスが通じているなら相対パスで指定できるのではないでしょうか。理屈上はできるはずなので文法のエラーでしょうか。同一市内だったら市街局番なしで電話できるのと同じ理屈です。よろしくお願いします。

  • テキストファイルからApp.Pathを読み込む

    いつもお世話になっております。 iniファイルに記載されているApp.Pathの文字列を普通に読み込むと"App.Path"という文字列として認識され、実行ファイルのパスが取得できません。iniファイルから読み込んだApp.Pathの文字列を、通常VB上で行ったときと同じように実行ファイルのパスと認識させる何かよい手はないでしょうか コピーするファイルが、実行ファイルのパスだったりSystem32内だったりほかのフォルダだったりする可能性があるので、ソースに直書きできないので困っております。

  • makefileでのファイル指定について

    プログラムを実行するためのコンパイルでは、makeを使うことが多いと思います。makefileというファイルにその内容を書いておくわけですが、makeというのは必要なものをかき集めて(不必要なものは集めない)セットしていくということなるわけですね。ファイルを集めるというのは結局はフォルダを指定するということなのですが、そのフォルダとは相対パスで指定するのか、絶対パスで指定するのか考え方を教えて頂きたいのですが。私の予想では当然ながら相対パスが普通だということなのですが。また絶対パスでもいいということにもなるでしょうか。./とかつけてフォルダ指定すると相対パスになるとか。makeは苦手でそこを確認したいと思いました。 あと、必ずではありませんが./configureとかしますが、これは何をしているのでしょうか。 よろしくお願いします。OSとしてはWindows, WSLというところでの利用を考えています。

  • バッチファイルの文字判定について

    バッチファイルの文字判定について 以下のような処理をさせたいのですがうまくいきません。 変数Aの中に格納されている文字列の内、 ":"記号が1つでもあった場合→処理実行 ":"記号が1つもなかった場合→goto :eof ディレクトリのパスが納まっているかの確認で、":"を探すようにしました。 あまり良い方法でもないので、ディレクトリのパスが変数に入っているかの確認も、 併せてご教授くだされば幸いです。

  • javaでhtmlファイルを開く方法

    通常は、下記のような記述をすれば、html.htmlファイルを開けると思うのですが開けせん。どうすれば、開くことができますか? また、ディスクトップで実行しているのですが、Javaファイルと同じディレクトリ(デスクトップ)にあるhtml.htmlファイルを開くことはできないのしょうか? 相対パスで記述するとエラーになります。 初歩的な質問かもしれませんが、ご教示、宜しくお願い致します。 String[] cmd = {"C:\\html.html"}; Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(cmd);

    • ベストアンサー
    • Java
  • rundll32.exe(またはその構成ファイル)が見つかりません。

    windows98SEを使用しています。 フォトショップでデータを保存中にPCがフリーズしてしまい(アクセスランプ点灯)、強制終了も出来ず仕方なく電源の長押しでシャットダウンしました。 その後、電源を入れるとスキャンディスクが実行され 「スキャンディスクはドライブ上に無効なファイル名のエントリを見つけましたが修復できませんでした。この問題を修正するにはWINDOWS版のスキャンディスクを実行してください。」 と出たのでスキャンディスクを実行しようとしたところ、 「スキャンディスクが見つかりません。プログラムファイルが壊れているか、または削除されています。もう一度WINDOWSのセットアップを実行してインストールしてください。」 と出たのでコントロールパネルのアプリケーションの追加と削除で再インストールを試みたところ、 「ファイル`c\windows\rundll32.exe'(またはその構成ファイル)が見つかりません。パスおよびファイル名が正しいか、必要なライブラリがすべて可能かどうか、確認してください。」 というメッセージが出て何も出来ません。 この後どうすればよいのでしょうか?

  • バッチファイルを実行するとエラーが出る

    win2000を利用しています。起動時に自動的にアプリケーションを実行させるバッチファイルを作りたいのですがエラーがでます。 以下のように書いています。このバッチファイルをスタートアップに入れて実行させたいと思っています。 そして試しに手動で実行してみると、構成ファイルが見つからない、パス名を確認してくださいと言ったいエラーが出ます。 パスが間違っているのかと思い、 「C:\Program Files\Internet Explorer\IEXPLORE.EXE」だけをファイル名を指定して実行をするとちゃんとIEが起動します。 何が間違っているのかわからないのですが、ヒントだけでもお願いします。 test.bat(ファイル名) --------------------------- start C:\Program Files\Internet Explorer\IEXPLORE.EXE ---------------------------

  • Cドライブ内のフォルダを隠しファイルにした

    Windows98を使っています。1999年から。 Cドライブ内って、大事なファイルが入っていて、 誤って削除したりすると、危険なんですよね。 そー思って、1週間前、 Cドライブ内の、最初からあったフォルダを、 全部、隠しフォルダにしました。 Cドライブ内のファイルも。 (Q1)上に書いたのと同じことしてる人って、います? Windowsフォルダにアクセスしたいときは、 アドレスバーにC:\WINDOWSと書いているし、 プログラムフォルダにアクセスしたいときは、 アドレスバーにC:\Program Filesと書いています。 「ういんどうず」って書けばC:\WINDOWSという文字列が出て、 「ぷろぐらむ」って書けばC:\Program Filesという文字列が 出るように単語登録しています。 (Q2) ところでパソコン内のパスの、\っていう文字、 どうやって出すの? 分からないからコピペで出してます。 (Q3) Cドライブ内の、最初から入っている、ファイルやフォルダって、 [右クリック→削除]をすれば、削除されちゃうんですか? それとも、出来ないようになっているんですか? お暇でしたら、是非、ご回答をお願いします。

  • Setupで「Path or File Not Found」のエラー

    ディストリビューションウィザードで作成したSetup.exeを実行すると、   「Path or File Not Found」   「次のラベルのディスクを挿入してください。'ディスク 0' ドライブ F:」 というエラーが発生します。 過去ログなどを検索していても   「ログイン名に2バイト文字を使用している」 という原因しか見つけられなかったのですが、 ログイン名は半角英数字になっています。 ログイン名が2バイト文字、ということ以外に 何か原因は考えられますでしょうか? よろしくお願い致します。

  • インストール(セットアッププログラム)の自作について(OSはVISTA

    インストール(セットアッププログラム)の自作について(OSはVISTA、WIN7です。) あるプログラムをインストールする前、もしくは後に別のプログラムを実行させるようなバッチファイルを作りたいのです。 「SETUP_1.exe」の実行 次に 「SETUP_2.exe」の実行 という連続処理を、例えばSETUPALL.exeを一回実行させれば行える様なバッチファイルです。 SETUP_1.exeとSETUP_2.exeのパスが固定ならバッチファイルにパスを指定して書けばいいので それはわかるのですが、USBとかCDで配布した時にドライブ名がPCによって変わると思うのでどうすればよいかわかりません。「カレントフォルダ(?)のSETUP_1.exe」というような指定の仕方をする方法があるのでしょうか?普通のバッチファイルの処理では無理でしたら、他によい方法はありますでしょうか?