C++获取文件大小信息的更快方法
Faster way to get File Size information C++
我有一个函数来获取文件的文件大小。 我正在 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;
}
相关文章:
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- Qt中的包装连接方法隐藏了编译器所需的信息
- C++获取所有继承类信息的方法
- 什么是阅读和将信息与此文本文件分开的好方法
- 该代码注入第三方Qt应用程序并执行一些方法来获取Qt应用程序信息
- 从.txt文件中汲取信息的最佳方法
- OpenGL-更新模型信息的最有效方法(例如模型矩阵)
- 将信息从 2D 矢量传输到地图的最快方法是什么
- 获取有关io_service的其他信息的任何方法
- 使用预处理器宏构造用于抛出 std::exception 的信息消息的简单方法
- 有没有一种方法可以获得关于助推的信息::蝇量级内部容器
- 方法在C++中存储一些数字(有关详细信息,请参阅内部)
- 收集在线数据/信息并将其报告给程序的方法
- 是否有C++11或Win32方法可以可靠地生成和保存跟踪信息
- 有没有一种方法可以从镶嵌图中提取文档的风格信息
- c++中带调试信息和不带调试信息的函数设计方法
- 从c#调用c++ dll中的方法,没有任何信息,只有头文件
- 一个c++ signals2槽回调可以包含Objective-C/ c++类/选择器(方法)信息吗?
- 如何从方法返回可选的调试信息
- 是否有一种方法可以从VS环境之外的MS单元测试框架中获取信息