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