C++获取文件大小信息的更快方法

Faster way to get File Size information C++

本文关键字:方法 信息 获取 文件大小 C++      更新时间:2023-10-16

我有一个函数来获取文件的文件大小。 我正在 WinCE 上运行这个。 这是我当前的代码,它似乎特别慢

int Directory::GetFileSize(const std::string &filepath)
{
    int filesize = -1;
#ifdef linux
    struct stat fileStats;
    if(stat(filepath.c_str(), &fileStats) != -1)
      filesize = fileStats.st_size;
#else
    std::wstring widePath;
    Unicode::AnsiToUnicode(widePath, filepath);
    HANDLE hFile = CreateFile(widePath.c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if (hFile > 0)
    {
      filesize = ::GetFileSize( hFile, NULL); 
    }
    CloseHandle(hFile);
#endif
    return filesize;
}

至少对于Windows,我想我会使用这样的东西:

__int64 Directory::GetFileSize(std::wstring const &path) { 
    WIN32_FIND_DATAW data;
    HANDLE h = FindFirstFileW(path.c_str(), &data);
    if (h == INVALID_HANDLE_VALUE)
        return -1;
    FindClose(h);
    return data.nFileSizeLow | (__int64)data.nFileSizeHigh << 32;
}

如果您使用的编译器支持它,您可能希望使用 long long 而不是 __int64 。不过,您可能不想使用int,因为这仅适用于最大 2 GB 的文件,并且大于此的文件现在非常常见(尽管在 WinCE 设备上可能并不常见)。

我希望这比大多数其他方法更快。它根本不需要打开文件本身,只需查找文件的目录条目(或者,在 NTFS 之类的情况下,其主文件表条目)。

您的解决方案已经相当快地查询文件大小。

在Windows下,至少对于NTFS和FAT,文件系统驱动程序会将文件大小保留在缓存中,因此查询它相当快。涉及的最耗时的工作是从用户模式切换到内核模式,而不是文件系统驱动程序的处理。

如果你想让它更快,你必须在用户模式下使用自己的缓存策略,例如一个特殊的哈希表,以避免从用户模式切换到内核模式。但我不建议你这样做,因为你不会获得什么表现。

PS:你最好避免在你的函数体中Unicode::AnsiToUnicode(widePath, filepath);语句。此功能相当耗时。

只是一个想法(我还没有测试过),但我希望 GetFileAttributesEx在系统级别上最快。 它避免了必须打开文件,从逻辑上讲,我希望它比FindFirstFile更快,因为它不必保留任何信息以继续搜索。

你可以自己滚动,但我不明白为什么你的方法很慢:

int Get_Size( string path )
{
// #include <fstream>
FILE *pFile = NULL;
// get the file stream
fopen_s( &pFile, path.c_str(), "rb" );
// set the file pointer to end of file
fseek( pFile, 0, SEEK_END );
// get the file size
int Size = ftell( pFile );
// return the file pointer to begin of file if you want to read it
// rewind( pFile );
// close stream and release buffer
fclose( pFile );
return Size;
}