更快地获取文件大小信息C ++

时间:2013-01-31 14:28:20

标签: c++ optimization windows-ce

我有一个函数来获取文件的FileSize。我在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;
}

4 个答案:

答案 0 :(得分:11)

至少对于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千兆字节的文件,而且大于此的文件现在很常见(尽管可能不常见)一个WinCE设备)。

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

答案 1 :(得分:1)

您的解决方案已经非常快速地查询文件大小。

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

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

PS:你最好避免在函数体中使用Unicode::AnsiToUnicode(widePath, filepath);语句。这个功能非常耗时。

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

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

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;
}