2015-07-09 58 views
0

我使用GetFileAttributes來檢查是否存在(標準的「你要替換現有文件」)GetFileAttributes創建文件,並顯示一個對話框,向用戶返回前FILE_ATTRIBUTE_ARCHIVE爲不存在的文件

if (GetFileAttributes(szFilePath) != 0xffffffff) { /* display "do you want to replace?"*/} 

有時,它會返回成功的文件,不能可能存在,因爲它將在文件夾中有只是已創建(使用CreateDirectory)。當它發生時,它返回的屬性就是FILE_ATTRIBUTE_ARCHIVE。

任何想法是怎麼回事?

編輯:爲了響應無盡的一系列「你應該使用INVALID_FILE_ATTRIBUTES」,我已經這樣做了。

DWORD dwFile = GetFileAttributes(szFilePath); 
if (dwFile != INVALID_FILE_ATTRIBUTES) { /* display "do you want to replace?"*/} 

我得到了同樣的結果。對於不存在的文件,dwFile返回FILE_ATTRIBUTE_ARCHIVE。我很確定它不存在。該文件夾只是剛創建。我沒有使用GetTempFileName()。我可以從調試器中複製szFilePath,並使用Explorer和命令行訪問文件夾,但他們都沒有顯示文件存在。

+2

你應該使用'INVALID_FILE_ATTRIBUTES'而不是一個幻數。 –

+0

是的。但是,這仍然不等於FILE_ATTRIBUTE_ARCHIVE。 – jbcarpen

+0

爲什麼不只是忽略這些屬性並嘗試創建文件,並讓它失敗,如果它已經存在? CreateFile()具有CREATE_NEW特性。如果文件已經存在,它會報告一個'ERROR_FILE_EXISTS'錯誤。如果用戶同意覆蓋,則可以使用「CREATE_ALWAYS」配置創建文件。 –

回答

1

好吧,事實證明這是從DOS的延期。具體的文件名是重要的。 假設系統中不存在c:\ aux.c並且您擁有'C'驅動器,則以下代碼行將重現此問題。 (我與行爲的初次邂逅是在一個樹深,但是這是一個很好的最小的情況下)。

DWORD dwFile = GetFileAttributes(TEXT("C:\\aux.c")); 

它已經結束了有關這一問題上的超級用戶 Why does this file apparently not exist when attempting to delete it? 但是也有一些保護的某些文件名,甚至當該文件實際上並不存在,並且從未存在過。

CON,PRN,AUX,CLOCK $,NUL,COM1,COM2,COM3,COM4,COM5,COM6,COM7,COM8,COM9 LPT1,LPT2,LPT3,LPT4,LPT5,LPT6,LPT7,LPT8,和LPT9。

這些都是受保護的,如果遇到您試圖在Windows上編輯/創建/刪除它們的情況,可能會導致問題。

+1

這就是爲什麼你想發佈一個最小的完整和可驗證的例子。如果你的帖子顯示你正在試圖刪除一個名爲'aux.c'的文件,那麼以前有人可能已經指出了這個問題。 –

+0

這是在這裏問101的問題。顯示一個MCVE。你被問到了。 –

+0

我確實被問到。但是,我在創建MCVE的過程中找到了答案。所以對一個人的要求本身就很有幫助。 – jbcarpen

相關問題