ファイルを開くコストをかけずに、ファイルが存在するかどうかを確認する方法はありますか(今のところWindowsのみ)?
現在使用しているもの:
ifstream ifile(FilePath);
if(ifile){
しかし、問題は、ファイルをブーストmapped_regionに配置し、それによってファイルを2回開くことです。ファイルを開かずにファイルの存在を確認できればもっと良いでしょう。
ファイルを開くコストをかけずに、ファイルが存在するかどうかを確認する方法はありますか(今のところWindowsのみ)?
現在使用しているもの:
ifstream ifile(FilePath);
if(ifile){
しかし、問題は、ファイルをブーストmapped_regionに配置し、それによってファイルを2回開くことです。ファイルを開かずにファイルの存在を確認できればもっと良いでしょう。
チェックしてから開こうとしても、ファイルをチェックしてから開こうとするまでの間に、ファイルが移動または削除される可能性が常にあることに注意してください。これは、これらの種類の操作では常に危険です。
マップされた領域の作成の一部として単純にファイル バッファを開く方が効率的かもしれませんが、interprocess_exception
エラーが発生した場合にスローされるのをキャッチする準備をしておく必要があります。
procmon (Sysinternals から) をプログラムにアタッチし、Windows がフードの下で何を行っているかを調べてみると、同じ量のオーバーヘッドが発生するか、CreateFile
またはそれによって発生するオーバーヘッドは、パフォーマンスの点で目に見える違いはありません。GetFileAttributes
NTFS ジャーナルを使用して特定の処理を高速化することができますが、これは特定のワークロードにのみ役立ち、一般的にディスク上のファイルの可用性を確認する場合には役立ちません。
確認したいのはaccess(FilePath, F_OK)==0 です
これは、ファイルが存在するかどうかを確認するための非常に普遍的な方法です。コンポーネント 10 で述べたように、並列シナリオで発生する可能性があるたびにチェックからファイルが存在することを確認することはできませんが、TBH はそれほど重要ではありません。エラーが発生した場合は、システムの GetLastError (MSDN) 関数を使用するか、エラーの処理をコンパイラ/システムに任せることができます。自分で処理する場合は、名前を尋ねて再試行できます。