11

ファイルから読み取り、ファイルに書き込むプログラムがあります。ユーザーが両方に同じファイルを指定できないようにしたい (明らかな理由から)。最初のパスが にchar* path1あり、2 番目のパスが にあるとしchar* path2ます。fopen()両方のパスに電話fileno()をかけ、同じ番号を取得できますか?

より明確に説明するには:

char* path1 = "/asdf"
char* path2 = "/asdf"

FILE* f1 = fopen(path1, "r");
FILE* f2 = fopen(path2, "w");

int fd1 = fileno(f1);
int fd2 = fileno(f2);

if(fd1 == fd2) {
  printf("These are the same file, you really shouldn't do this\n");
}

編集:

ファイル名を比較したくありません。パスのようなもの/asdf/./asdfやシンボリックリンクを使用することで、ファイル名を簡単に無効にすることができるからです。最終的に、読み取り元のファイルに出力を書き込みたくありません (重大な問題が発生する可能性があります)。

4

1 に答える 1

24

はい - ファイル デバイス ID と inode を比較します。<sys/stat.h>仕様ごと:

st_ino フィールドと st_dev フィールドを組み合わせると、システム内のファイルが一意に識別されます。

使用する

int same_file(int fd1, int fd2) {
    struct stat stat1, stat2;
    if(fstat(fd1, &stat1) < 0) return -1;
    if(fstat(fd2, &stat2) < 0) return -1;
    return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino);
}
于 2012-09-19T20:54:31.933 に答える