2012-12-19 34 views
7

可能重複:
What’s the best way to check if a file exists in C? (cross platform)C,檢查文件是否存在而不能讀/寫可能?

我想檢查文件是否存在。我將我的測試文件的權限更改爲「chmod -r somefile」。但是現在它說文件即使存在也不存在。

因此,我假設如果我沒有讀取權限,我無法打開與「fopen r」文件。但是這意味着沒有簡單的方法可以判斷文件是否存在或者無法讀取/寫入?

或者我錯過了什麼?任何幫助都會很棒。

謝謝!

int doesFileExist(const char* filename) 
{ 
    FILE* fptr = fopen(filename, "r"); 
    if (fptr != NULL) 
    { 
    fclose(fptr); 
    printf("File exists\n"); 
    return 1; 
    } 
    printf("File doesnt exist\n"); 
    return 0; 
} 

更新:謝謝你們這些偉大的鏈接和解釋!

+1

呃..你有沒有檢查過'errno'?編輯:試試這個得到一些錯誤信息:'printf(「文件不存在:%s \ n」,strerror(errno));'不要忘記包含'errno.h'頭文件。 – Jack

+0

這就是我討厭stdio API的原因,無論何時你需要做一些不平凡的事情如調整文件大小,或者移動文件而不復制它並刪除舊文件,在可移植性方面你都會走運。 – Thomas

回答

18

fopen實際上會嘗試打開文件,如果您沒有讀取權限,則不能執行此操作。爲了在不打開文件的情況下檢查文件是否存在,請使用stat; stat爲您提供有關文件的元數據,只需要讀取包含文件的目錄,而不是文件本身。

int doesFileExist(const char *filename) { 
    struct stat st; 
    int result = stat(filename, &st); 
    return result == 0; 
} 

你可以通過檢查errno如果result不爲0時更大膽的嘗試;如果errnoENOENT那麼文件不存在,如果它是ENOTDIR那麼你提供的路徑的一部分不是目錄,如果它是EACCESS那麼你沒有讀取路徑中的目錄之一的權限,所以stat可以給你一個答案,等等。另外,請注意,如果您使用符號鏈接(任何類Unix或Windows Vista或更高版本)的平臺,那麼您應該注意是否查詢符號鏈接或它指向的文件。如果你打電話給stat,那麼你問的是它指向的文件;如果你有一個符號鏈接dir/link,它指向other/file,那麼stat將返回關於other/file的結果(這通常是你想要的,因爲如果你打開文件就會得到這個結果)。但是,如果您對鏈接本身感到好奇(如果您想知道「dir/link是否存在,即使other/file不存在?」),那麼您應該使用lstat()

stat()在Windows上作爲兼容性包裝(他們更喜歡使用_stat(),如果不這樣做會發出警告),但通常使用本機平臺API更好。在Windows上,您應該使用GetFileAttributes()

int doesFileExist(const char *filename) { 
    return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; 
} 
-1

在Linux(和許多其他系統)上,您可以使用opendir()和朋友列出目錄。我猜只讀文件會顯示出來。其他平臺上應該有類似的功能。

1

你並沒有真正檢查文件是否存在這裏...你正在檢查你是否可以通過讀訪問來打開它。由於文件不存在以外的原因,它可能會失敗。正如你所看到的,你可能沒有讀取權限。也可能是該文件被鎖定。

檢查這個答案:

What's the best way to check if a file exists in C? (cross platform)

它建議使用stat,它應該在大多數情況下,除非你沒有讀就在該文件所在的目錄訪問。

相關問題