2013-03-30 49 views
-3

位於c相同,我需要看看2個文件相同 所以我用 結構統計如何確定兩個文件使用系統調用

fdin = open(argv[0],O_RDONLY); 
    statos= fstat(fdin, &stat); 
    close(fdin); 
    fdin = open(argv[1],O_RDONLY); 
    statos1= fstat(fdin, &stat1); 
    close(fdin); 
    printf("file 1 is in size: %lu\n",stat1.st_ino); 
    printf("file 2 is in size: %lu\n",stat.st_ino); 

結果

file 1 is in size: 9569486 
file 2 is in size: 9569479 

爲什麼st.ino對於具有相同路徑的相同文件是不相同的? 和我怎麼能這樣做,如果兩個不同的文件是相同的,我可以檢查它與系統調用

+0

你不打開同一個文件。你如何運行它? – teppic

+0

./a.out ab.txt ab.txt –

+2

這是因爲argv [0]包含可執行文件的名稱。你應該使用argv [1]和argv [2]。如果您不相信我,請打印您參考的文件名。 – FrankieTheKneeMan

回答

1

st_ino是文件的inode號碼的字段,inode號碼是每個文件結構的唯一標識符。 inode結構保存stat調用返回的關於文件的信息。

你想要的領域是st_size

+0

$ gcc main.C $ ./a.out ab.txt ab.txt 文件1的大小:4 文件圖2是在大小:7393 –

+0

此\t的printf( 「文件1是大小:%錄\ n」 個,stat1.st_size); \t的printf( 「文件2是在大小:%錄\ n」 個,stat.st_size); –

3

這是因爲你打開兩個不同的文件:

./a.out ab.txt ab.txt 

argv[0]是可執行文件,argv[1]是 'ab.txt'。

如果你在你的代碼中加入錯誤檢查,那很明顯。

出於某種原因,您還將inode打印爲「大小」。

0

你沒有定義什麼相同的文件對你來說意味着

在Unix或Linux(或Posix)上,符合Posix標準的文件系統(如ext4btrfs而不是FAT32),文件可以沒有,一個或多個文件路徑。所以文件路徑指的是inodes。然後,如果兩個文件路徑指向相同的inode(在相同的文件系統中),則它們指向相同的基礎文件。

您可以使用系統調用stat(2)來獲取某個文件路徑的設備(即文件系統)st_dev和inode編號st_ino。那麼你應該比較兩者。

另外,你可能會想像相同的文件意味着你的文件具有相同的內容。這是一個不明確的定義:文件的內容可能會改變(因爲它在讀取時會同時被寫入,通過一些其他進程寫入,例如write(2),通過一些mmap(2) -ing等等)。所以狹義比較文件內容(這是一個昂貴的操作)無厘頭:在內容可以通過一些其他過程期間比較被改變。

如果您錯誤地忽略了文件內容可能發生變化的事實(因爲另一個進程正在寫入同時正在讀取它),您可以讀取這兩個文件並比較每個字節(同時考慮到結尾-of文件)。事情就這麼簡單:

FILE *f1 = fopen(path1, "r"); 
if (!f1) { perror(path1); exit(EXIT_FAILURE); }; 
FILE *f2 = fopen(path2, "r"); 
if (!f2) { perror(path2); exit(EXIT_FAILURE); }; 
bool samefile = true; 
int c1, c2; 
while (samefile && ((c1 = getc(f1)) != EOF) || (c2 = getc(f2)) != EOF)) 
    if (c1 != c2) samefile = false; 
fclose (f1), fclose (f2); 

您可以通過使用fseek(3)ftell(3)

你也可以使用純open(2)read(2)close(2)系統調用,是比較f1f2第一大小優化上面的代碼確保按塊(例如4K字節)讀入緩衝區(每個文件一個),並處理文件結束條件並檢查錯誤。

正如其他人所指出的,你的程序是錯誤特別是因爲argv[0]是程序的命令名稱。