2011-09-17 76 views
3

給定路徑,有沒有辦法在不打開文件的情況下確定文件是否存在?存在給定路徑的文件

感謝

+0

值得一提的是,如果你打算如果該文件存在做一些事情,你應該嘗試做的事情。這可能是一種稱爲「在你飛躍之前」的反模式。 –

回答

7

最有效的方法是accessF_OK標誌。

stat也適用,但它更重的重量,因爲它具有讀取inode的內容,而不僅僅是目錄。

+0

訪問........ –

+0

http://linux.die.net/man/2/access –

+2

更正鏈接:http://pubs.opengroup.org/onlinepubs/9699919799/functions/access.html –

3

可以使用stat系統調用。請確保您檢查了errno是否有正確的錯誤,因爲stat因多種其他原因/失敗可能會返回-1

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
main() 
{ 
     struct stat BUF; 
     if(stat("/Filepath/FileName",&BUF)==0) 
     { 
       printf("File exists\n"); 
     } 
} 

另一種方法是通過使用access功能。

#include <unistd.h> 

main() 
{ 
     if(access("/Filepath/FileName", F_OK) != -1) 
     { 
       printf("File exists\n"); 
     } 
     else 
     { 
       printf("File does not exist\n"); 
     }  
} 
+1

如果您想知道文件是否存在並且可以訪問(適當的權限,讀取和/或寫入權限等),有人建議只打開它並查看打開是否成功。當你需要關於文件的附加信息時,或者當你想知道它是否存在,即使你無法打開它時,「stat」也是有意義的......儘管仍然有可能沒有足夠的權限訪問stat文件,所以即使你可能需要在失敗時檢查「errno」。 – Dmitri

+0

@Dmitri:OP正在尋找替代方法來檢查文件的存在,並明確說明狀態而不嘗試打開它。我們不知道OP要施加什麼樣的限制/條件。鑑於「stat」是一個可行的選擇,答案指出。 –

+0

我並不打算對這個答案提出異議(我實際上贊成它)。我只是詳細闡述了一點,正是因爲我們不知道其他海報想要這樣做的原因。 – Dmitri

1
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <errno.h> 

int rc; 
struct stat mystat; 
rc = stat(path, &mystat); 

現在檢查RC和(可能)錯誤號。

編輯2011-09-18附錄:

兩個接入()和stat()返回0,如果路徑指向非文件(目錄,FIFO,符號鏈接,不管)

在stat()的情況下,可以用「((st_mode & S_IFREG)== S_IFREG)」來測試。 最好的方法仍然是嘗試用open()或fopen()打開文件。

-2

嘗試刪除它(取消鏈接())。如果成功,它就不存在了。如果不成功, 解釋錯誤號,看是否存在:)

+0

...然後從備份101恢復它 – technology