2010-11-02 282 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