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

C++ 获取文件大小信息的更快方法C++;,c++,optimization,windows-ce,C++,Optimization,Windows Ce,我有一个获取文件大小的函数。我在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.s

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

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

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;
}
int Get_Size(字符串路径)
{
//#包括
FILE*pFile=NULL;
//获取文件流
fopen_s(&pFile,path.c_str(),“rb”);
//将文件指针设置为文件结尾
fseek(pFile,0,SEEK_END);
//获取文件大小
int Size=ftell(pFile);
//如果要读取文件,请将文件指针返回到文件的开头
//倒带(pFile);
//关闭流并释放缓冲区
fclose(pFile);
返回大小;
}

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

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

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


PS:您最好避免使用语句
Unicode::AnsiToUnicode(widePath,filepath)在函数体中。这个函数相当耗时。

至少在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;
}
\uuu int64目录::GetFileSize(std::wstring const&path){
WIN32_FIND_DATAW数据;
handleh=FindFirstFileW(path.c_str(),&data);
if(h==无效的\u句柄\u值)
返回-1;
FindClose(h);
return data.nFileSizeLow |(uu int64)data.nFileSizeHigh只是一个想法(我还没有测试过),但我希望
GetFileAttributesEx
在系统级是最快的。它 避免了打开文件,从逻辑上讲,我希望它 要比FindFirstFile快,因为它不必
保留继续搜索所需的任何信息。

我非常怀疑添加几层C库代码是否会使搜索速度更快。您可能需要确认这确实是一段缓慢的代码。除非文件系统包含大量文件,否则我看不出任何特别的原因导致搜索速度缓慢[因此,搜索所有文件需要一段时间才能打开]。@Matstpeterson你说得有道理,当我发布这篇文章时,我意识到这可能是UnicodeToAnsi函数,因为它涉及字符串操作。我重构了代码以减少这些操作的使用,并且已经将速度提高了30%AnsiToUnicode调用时,您可能希望构建一个缓存来检查您是否已完成此文件并返回上一个文件…一些散列可能会有所帮助。从文件系统驱动程序的角度来看,目录也是一个文件。打开目录不能比打开普通文件快。这是一种享受,谢谢是的,减少了对AnsiToUnicode的调用。我以前索引所用的时间减少了一半。每次更改的作用都是一样的。@Jerry,你是对的。你的解决方案确实节省了打开的时间。这也意味着你不必在文件中查找。对我来说,因为我正在使用代码计算我已经访问过的许多文件的文件大小
WIN32\u FIND\u DATAW
已经这样操作也是“免费的”:D