2009-11-13 155 views
1

我想用它卸載過程中,提前向用戶發出警告。 該過程應該適用於W2000 +,因此不允許使用Vista API。如何檢查文件是否可以被刪除

這似乎趕上一些衝突:

if(GetFileAttributes(lpPath) == INVALID_FILE_ATTRIBUTES) 
{ 
    // File does not exist 
} 
else 
{ 
    BOOL bCanDelete = FALSE ; 
    HANDLE hFile = CreateFile(path, 
     GENERIC_WRITE /*|DELETE*/, 
     0 /*FILE_SHARE_DELETE*/, 
     NULL, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL, 
     NULL 
    ); 
    if(hFile != INVALID_HANDLE_VALUE) 
    { 
     DWORD size = 10000 ; // a number > file size allowed 
     if(size != INVALID_FILE_SIZE) 
     { 
      if(LockFile(hFile, 0,0, size,0)) 
      { 
       UnlockFile(hFile, 0,0, size,0) ; 
       bCanDelete = TRUE ; 
      } 
     } 
     CloseHandle(hFile) ; 
    } 
} 

即檢測到這些情況: 一)刪除運行exe文件 b)去除打開PDF

使用GENERIC_WRITE | DELETE似乎同樣的行爲。 單獨使用DELETE適用於情況b),但不適用於a)。

我沒有確鑿證據證明與LockFile()捕獲任何有意義的衝突,但假設它。

是否有人有更好的主意嗎?

回答

0

我不是一個C++程序員,但你可以嘗試重命名文件。如果你能做到這一點,你可能會刪除它。

+0

謝謝,但這個過程不能因爲兩個原因中: - 這是一個破壞性操作。 - 它不起作用。例如,一個正在運行的exe可以重命名,但不能被刪除。 (與打開的PDF不能重命名不同。) – 2009-11-16 12:34:39

1

第一點:除非你採取措施,以防止它,幾乎任何你可以報告你測試的時間之間的變化,並在嘗試的時候,你已經嘗試過檢查後,您基於該測試(如採取行動可以刪除它,用戶可能會將其更改爲「只讀」)。

爲了得到有意義的結果,而不是使用的DeleteFile刪除的文件,我會使用CreateFileFILE_SHARE_DELETEFILE_FLAG_DELETE_ON_CLOSE標誌。如果您無法以這種方式打開文件,它會提供很好的線索,您將無法刪除它。如果你可以打開它這樣,那麼簡單地關閉句柄將刪除的文件 - 沒有別的可以在此期間將其打開,除非它也規定FILE_SHARE_DELETE(即使是這樣,當最後一個句柄文件已關閉,文件將被刪除,所以如果不立即刪除,它將很快)。

+0

謝謝。 1)我認爲這是一個可以接受的風險。 (好吧,我們沒有事務性文件系統。)重點是我想在開始任何破壞性行爲之前發出警告。我知道,有特殊情況...... 2)我試過了,但是的CreateFile(FILE_SHARE_DELETE,FILE_FLAG_DELETE_ON_CLOSE)失敗的所有標誌組合我試過了。 (我的意思是2個標準試驗 - 打開PDF格式,運行EXE。) 作爲一個側面的話,我使用更復雜的刪除過程: 一個)的DeleteFile, b)中遙遠而明亮只讀屬性,然後重試刪除 C)MoveFileEx(路徑, NULL,MOVEFILE_DELAY_UNTIL_REBOOT) – 2009-11-16 13:04:10

相關問題