2015-06-16 18 views
0

我有一個完整的路徑存儲在char full_path[1000],我想知道是否存在任何在該位置。如何測試無法訪問的「文件」的存在?

(接下來的事情,這個檢查後,我的代碼會做的是建立在該位置的東西,但我希望它算作一個錯誤,如果已經有那麼點意思,而不是與rm -rf相當於清除斑點)

現貨可以通過一個文件或目錄或甚至一個鏈接到一些不再視爲現有目標如被佔用:

lrwxrwxrwx 1 user grp 4 Jun 16 20:02 a-link -> non-existent-thing

隨着無效鏈接,access(full_path, F_OK)是要告訴我我無法訪問full_path,這可能是因爲(1)此處不存在任何內容,或者因爲(2)鏈接無效。

鑑於此,確定full_path是否存在任何問題的最佳方法是什麼?

+0

char char full_path [1000]存儲文件路徑或只有一個directoyr? – mustangDC

+6

如果文件已經存在,open(path,O_CREAT | O_EXCL,mode)將返回失敗(-1),否則創建文件。這不像試圖「統計」,這是原子和安全的。 – EOF

+0

如果您無法訪問完整路徑 - 您無法訪問它。因此無法檢查。在創建它之前檢查是否存在某個東西會創建一個可被利用的競爭條件。 –

回答

1

由於我們打算做的下一件事是在該位置創建一些東西,並且由於我們希望將它視爲錯誤(如果某些東西已經存在),那麼請不要麻煩檢查。只要嘗試創建並退出時出現錯誤(如果失敗)。創建步驟使用symlink,所以如果失敗,我們可以使用strerror(errno)來解釋任何失敗。

要創建一個文件(相對於只是一個符號鏈接),EOF在註釋中指出open(path, O_CREAT|O_EXCL, mode)將返回失敗(-1),如果該文件已經存在,則創建該文件。這是原子性的和安全的(與嘗試stat不同),並保證在POSIX上自動工作(可能NFS例外)。

1

你根本無法以跨平臺的方式做到這一點。 stat()fopen()不起作用。你可以,但是,使用OS API,例如,在Windows下你可以使用WinAPI與示例代碼:

int doesFileExist(TCHAR* path) 
{ 
    WIN32_FIND_DATA FindFileData; 
    HANDLE handle = FindFirstFile(path, &FindFileData) ; 
    int found = (handle != INVALID_HANDLE_VALUE); 
    if(found) 
    { 
     FindClose(handle); 
    } 
    return found; 
} 

如果你只是要檢查是否有任何存在的,找到任何文件(再次,使用Windows API )也可以工作,你可以通過目錄去目錄檢查它是否存在,如果不存在 - 返回錯誤。繼續前進,直到找到目錄,然後按上述方式檢查某個文件。

假設你有C:/Dir1/Dir2/Dir3/file.txt那麼你首先要去C:,然後檢查Dir1是否存在,如果是的話 - 進入它,如果它沒有返回錯誤。 Dir2等等,直到你到達最後一個目錄並檢查文件,或者如果你沒有檢查某個文件和任何項目 - 只需使用MSDN中提到的功能來查找第一個文件或第一個目錄。