3

ファイルの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

4 に答える 4

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のような場合は、そのマスターファイルテーブルエントリ)を見つけるだけです。

于 2013-01-31T15:27:40.363 に答える
1

あなたのソリューションは、ファイルのサイズを照会するのにすでにかなり高速です。

Windowsでは、少なくともNTFSとFATの場合、ファイルシステムドライバはファイルサイズをキャッシュに保持するため、クエリを実行するのはかなり高速です。最も時間のかかる作業は、ファイルシステムドライバの処理ではなく、ユーザーモードからカーネルモードへの切り替えです。

さらに高速にしたい場合は、ユーザーモードからカーネルモードへの切り替えを回避するために、ユーザーモードで独自のキャッシュポリシー(特別なハッシュテーブルなど)を使用する必要があります。ただし、パフォーマンスがほとんど得られないため、これを行うことはお勧めしません。

Unicode::AnsiToUnicode(widePath, filepath);PS:関数本体のステートメントは避けたほうがいいです。この機能はかなり時間がかかります。

于 2013-01-31T14:59:32.953 に答える
1

単なるアイデア(私はそれをテストしていません)ですが GetFileAttributesEx、システムレベルで最速になると思います。ファイルを開く必要がなくなり、論理的にはFindFirstFile、検索を続行するための情報を保持する必要がないため、よりも高速になると思います。

于 2013-01-31T16:11:02.010 に答える
-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;
}
于 2013-01-31T14:40:36.360 に答える