次の2つの方法を使用してベンチマークを実行しました。
public static uint GetFileSizeA(string filename)
{
WIN32_FIND_DATA findData;
FindFirstFile(filename, out findData);
return findData.nFileSizeLow;
}
public static uint GetFileSizeB(string filename)
{
IntPtr handle = CreateFile(
filename,
FileAccess.Read,
FileShare.Read,
IntPtr.Zero,
FileMode.Open,
FileAttributes.ReadOnly,
IntPtr.Zero);
long fileSize;
GetFileSizeEx(handle, out fileSize);
CloseHandle(handle);
return (uint) fileSize;
}
GetFileSizeAは、2300を少し超えるファイルに対して実行され、実行に62〜63ミリ秒かかりました。GetFileSizeBは18秒以上かかりました。
私が間違っていることを誰かが見ない限り、どちらの方法が速いかについての答えは明らかだと思います。
実際にファイルを開かないようにする方法はありますか?
アップデート
FileAttributes.ReadOnlyをFileAttributes.Normalに変更すると、タイミングが短縮され、2つのメソッドのパフォーマンスが同じになりました。
さらに、CloseHandle()呼び出しをスキップすると、GetFileSizeExメソッドが約20〜30%速くなりますが、それをお勧めするかどうかはわかりません。