【问题标题】:c++ check if file is emptyc++ 检查文件是否为空
【发布时间】:2011-05-03 23:09:21
【问题描述】:

我有一个需要编辑的 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,但这不起作用。

谢谢,
伊莱

【问题讨论】:

    标签: c++ file winapi


    【解决方案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)
    }
    

    【讨论】:

    • 这可能不起作用,因为很多时候,当一个文件被写入它的元数据时,它的元数据包括它的文件长度没有更新。这就是为什么当您查看其目录时会看到大小为零的工作文件的原因。您必须“触摸”文件(例如,通过阅读)来更新其文件长度。
    • 来自 MSDN:注意:在极少数情况下,在您调用此函数 (FindFirstFile) 时,NTFS 文件系统上的文件信息可能不是最新的。要确保获取当前文件信息,请调用 GetFileInformationByHandle 函数。 @msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx
    • @Michael,感谢您的警告。如果我理解正确,则文件可能会显示为空,而不是相反?
    • 它可能显示为空或比实际存在的字节少。
    【解决方案2】:

    比较 hFile 和 HFILE_ERROR(不是 NULL!)。此外,您应该将 OpenFile 更改为 CreateFile 并正确调用它,OpenFile 早已被弃用。事实上MSDN明确指出:

    打开文件函数

    仅在 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);
    

    【讨论】:

    • 有没有使用 HFILE_ERROR 的例子?谢谢
    • 嗯,看起来我从来没有出错...也许是因为程序自动创建了一个空文件。您是否知道如何检查“DWORD hFileSize”值并将其与某物进行比较?
    • 您是否尝试测试文件是否存在或获取其长度?我不太明白你的目标。
    • 问题是程序会自动创建新文件(至少我是这么认为的 - 应用程序非常大,据我所知它是这样工作的)然后用户应该做一些动作在那个文件上,这就是我需要进行验证的地方。我需要检查文件是否为空或有一些内容。
    猜你喜欢
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2015-04-13
    • 2019-04-24
    相关资源
    最近更新 更多