2010-11-02 181 views
1

我得到了一個需要編輯的C++項目。這是變量聲明:C++檢查文件是否爲空

// Attachment 
    OFSTRUCT ofstruct; 
    HFILE hFile = OpenFile(mmsHandle->hTemporalFileName , &ofstruct , OF_READ); 
    DWORD hFileSize = GetFileSize((HANDLE) hFile , NULL); 
    LPSTR hFileBuffer = (LPSTR)GlobalAlloc(GPTR, sizeof(CHAR) * hFileSize); 
    DWORD hFileSizeReaded = 0; 
    ReadFile((HANDLE) hFile , hFileBuffer, hFileSize, &hFileSizeReaded, NULL); 
    CloseHandle((HANDLE) hFile); 

我需要檢查,如果該文件附後(我想我需要檢查是否有HFILE任何值),但不知道怎麼辦。我嘗試了hFile == NULL,但這並不能完成這項工作。

感謝,

回答

6

比較HFILE與HFILE_ERROR(不帶NULL!)。此外,您應該將OpenFile更改爲CreateFile並正確調用,OpenFile早已棄用。事實上MSDN中明確指出:

的OpenFile功能

只能使用此功能與16位 版本的Windows。對於較新的 應用程序,請使用CreateFile 函數。

當您進行此更改時,您將收到一個HANDLE,您應該將其與INVALID_HANDLE_VALUE進行比較。

更新:正確的方式來獲得文件的大小:你打開,你可以試試這個文件之前

LARGE_INTEGER fileSize={0}; 

// You may want to use a security descriptor, tweak file sharing, etc... 
// But this is a boiler plate file open 
HANDLE hFile=CreateFile(mmsHandle->hTemporalFileName,GENERIC_READ,0,NULL, 
         OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 

if (hFile!=INVALID_HANDLE_VALUE && GetFileSizeEx(hFile,&fileSize) && 
    fileSize.QuadPart!=0) 
{ 
    // The file has size 
} 
else 
{ 
    // The file is missing or size==0 (or an error occurred getting its size) 
} 

// Do whatever else and don't forget to close the file handle when done! 
if (hFile!=INVALID_HANDLE_VALUE) 
    CloseHandle(hFile); 
+0

是有使用HFILE_ERROR的任何例子嗎? Thx – 2010-11-02 14:07:23

+0

嗯,它看起來像我從來沒有得到錯誤...也許這是因爲程序自動創建一個空文件。你知道如何檢查'DWORD hFileSize'值是什麼,並將其與某些東西進行比較? – 2010-11-02 14:32:50

+0

你想測試文件是否存在或獲取其長度?我無法完全理解你的目標。 – 2010-11-02 14:51:10

1

WIN32_FIND_DATA wfd; 
HANDLE h = FindFirstFile(filename, &wfd); 
if (h != INVALID_FILE_HANDLE) 
{ 
    // file exists 
    if (wfd.nFileSizeHigh != 0 || wfd.nFileSizeLow != 0) 
    { 
     // file is not empty 
    } 
    FindClose(h) 
} 
+0

這可能無法正常工作,因爲通常情況下,文件正被寫入其元數據中,包括其文件長度未更新。這就是爲什麼當你查看他們的目錄時你會看到大小爲零的工作文件。您必須「觸摸」文件(例如通過閱讀文件)來更新文件長度。 – 2010-11-02 16:12:12

+0

從MSDN:注意:在極少數情況下,在調用此函數(FindFirstFile)時,NTFS文件系統上的文件信息可能不是最新的。要確保獲取當前文件信息,請調用GetFileInformationByHandle函數。 @ http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx – 2010-11-02 16:19:36

+0

@邁克爾,感謝您的注意。如果我理解正確,那麼當文件不存在時,文件可能會顯示爲空,但不是相反的方式? – 2010-11-02 16:27:40