掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23596

二つのファイル名が、同じファイルかどうかを判定する方法
投稿者---moon(2005/10/14 12:19:54)


初めて質問させていただきます。
今、ファイルコピーのようなプログラムを作っています。

コピー元ファイル名とコピー先ファイル名を入力し、片方を "r" で、もう片方を "w" で fopen するのですが、入力された二つのファイル名が、同じファイルを指している場合、正常に動作しないと思います。

そこで、この二つのファイル名が同じファイルを指しているかどうかを判定したいのですが、どうすればよいのでしょうか?
環境は Windows (VC6) です。

ちなみに、 UNIX の場合は stat関数を使って st_dev と st_ino が一致すれば同じファイルだと教わりましたが、Win では _stat を使ってもダメなようです。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:二つのファイル名が、同じファイルかどうかを判定する方法 23597 まきじ 2005/10/14 12:33:13
<子記事> Re:二つのファイル名が、同じファイルかどうかを判定する方法 23598 かずま 2005/10/14 13:18:50
<子記事> Re:二つのファイル名が、同じファイルかどうかを判定する方法 23645 moon 2005/10/16 11:32:33


No.23597

Re:二つのファイル名が、同じファイルかどうかを判定する方法
投稿者---まきじ(2005/10/14 12:33:13)


>そこで、この二つのファイル名が同じファイルを指しているかどうかを判定したいのですが、どうすればよいのでしょうか?

_fullpath() などで絶対パスを取得して strcmp() とか。


この投稿にコメントする

削除パスワード

No.23598

Re:二つのファイル名が、同じファイルかどうかを判定する方法
投稿者---かずま(2005/10/14 13:18:50)


> そこで、この二つのファイル名が同じファイルを指しているかどうかを
> 判定したいのですが、どうすればよいのでしょうか?
>環境は Windows (VC6) です。

FileInformation を取得して、VolumeSerialNumber と FileIndex が一致する
かどうかを確かめればよいはずですが、もっと簡単な方法はないのかな?
#include <windows.h>

int same_file(const char *f1, const char *f2)
{
    HANDLE h1, h2;  BY_HANDLE_FILE_INFORMATION fi1, fi2;

    h1 = CreateFile(f1, GENERIC_READ, FILE_SHARE_READ, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (h1 == INVALID_HANDLE_VALUE) return 0;

    h2 = CreateFile(f2, GENERIC_READ, FILE_SHARE_READ, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (h2 == INVALID_HANDLE_VALUE) { CloseHandle(h1); return 0; }

    if (!GetFileInformationByHandle(h1, &fi1)) return 0;
    if (!GetFileInformationByHandle(h2, &fi2)) return 0;
    CloseHandle(h1);  CloseHandle(h2);
    return fi1.dwVolumeSerialNumber == fi2.dwVolumeSerialNumber
        && fi1.nFileIndexHigh == fi2.nFileIndexHigh
        && fi1.nFileIndexLow == fi2.nFileIndexLow;
}



この投稿にコメントする

削除パスワード

No.23599

Re:二つのファイル名が、同じファイルかどうかを判定する方法
投稿者---YuO(2005/10/14 13:36:12)


>FileInformation を取得して、VolumeSerialNumber と FileIndex が一致する
>かどうかを確かめればよいはずですが、もっと簡単な方法はないのかな?

基本的にはこの方法しかないでしょう。
# ハードリンクがあると,ファイル名による比較は破綻するから。
# ドライブをまたぐシンボリックリンクに対応できるかは不明。

ただし,これだけだと異なるストリームに対して適応できません。
つまり,test.txtとtest.txt:testは同一ファイルの異なるストリームに対する入出力ですが,
同一であるとみなされてしまいます。

目的によりますが,
・副次ストリームに対応しない→GetFileInformationByHandleでよい
・副次ストリームに対応する→同一ファイルの場合はファイル名からストリーム名を取り出して比較する
が必要になると思います。



この投稿にコメントする

削除パスワード

No.23645

Re:二つのファイル名が、同じファイルかどうかを判定する方法
投稿者---moon(2005/10/16 11:32:33)


みなさん、回答ありがとうございます。
その後、GetFileInformationByHandle などでググってみたところ、これが定番のようです。ただ、これを使っても場合によっては完全ではない? ようなことが書かれているページも結構みつかりましたが…。

それほど厳密にすることも考えてないので、 _fullpath と文字列比較でしのぐのもありかとも思っています。

どうもありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧