大規模なプロジェクトに取り組んでいるときに、非常に奇妙な問題に遭遇しました。同じサイズのファイルをパーティションに書き込みます (RAM ディスクと で作成した仮想ディスクの両方を試しましたdiskmgmt.msc
)。別のファイルを収めるのに十分な空き容量がない場合 ( で報告されているように)、以前に作成したファイルの 1 つ(1 つだけ)GetDiskFreeSpaceExW
を削除し、新しいファイルを書き込みます。次に、別の古いファイルを削除し、無限に新しいファイルを書き込みます (したがって、パーティションは同じサイズのファイルのリング バッファーと考えることができます)。一連の書き込みと削除 (数百から数千) の後、新しいファイルの書き込み中にエラーが発生しました (その前に、十分なスペースが報告されます)。私は何人かの同僚に、彼らのハードウェアで問題を再現するように依頼しましたが、問題はno free space
GetDiskFreeSpaceExW
再浮上しませんでした。
物事を少し明確にするために、正確なアルゴリズムは次のとおりです。
- ファイルサイズを選択してください (たとえば、S バイト)
- GetDiskFreeSpaceExW で空き容量を確認する
- free_space > S の場合: サイズ S の新しいファイルを書き込み、2 に進む
- Else: 1 つのファイルを削除して 2 に進む
サイズが 4096 バイトのブロックでファイルにデータを書き込むことに注意することが重要です (ブロック サイズによっては、問題が再発生する場合と発生しない場合があります)。ファイルサイズは5MBです。NTFS パーティション サイズは 21 MiB です。クラスタ サイズは 512 B です (ここでも、これらのパラメータを変更すると結果に影響します)。これらのパラメータでは、684 番目のファイルの作成中にエラーが発生します。RAM ディスクと仮想ディスクのどちらを使用するかには依存しません (したがって、特定の実装の問題ではありません)。
障害発生後に得られたディスク イメージ ダンプを分析したところ、ファイルが大幅に断片化されていることがわかりました。Chkdsk では、実験の前後に問題は報告されていません。システム ログにエラーは見つかりませんでした。
私のネットブック(Dell Inspiron 1110)のおそらく関連するパラメータ:
- Pentium SU4100、比較的遅いデュアルコア x64 CULV CPU (1.3 GHz)
- Windows 7 アルティメット x64 エディション
- 2GBのRAM
何が起こっているのか、それをデバッグする方法について何か知っている人はいますか? 追加情報はどこで確認できますか? 私はすでにアイデアが尽きており、できるだけ早くこの問題を解決する必要があります...
UPD:ファイルを作成するときではなく、ファイル データを書き込んでいるときに問題が発生します (つまりwrite()
、失敗します) 。したがって、MFT エントリが不足しているようには見えません。
UPD2:寄せられたいくつかの質問に答える
- パーティションは新しくフォーマットされたものであるため、ファイルの特定の属性、ディレクトリ構造、何もありません
- 権限はデフォルトです
- .lnk もハードリンクもありません - 私が書いたファイルのみ
- すべてのファイルはルート ディレクトリに書き込まれ、それ以上のディレクトリは作成されません
- ファイル名は単純にファイルの序数です (つまり、1、2、3、...)
- 代替データ ストリームはありません。ファイルは `fopen()` を使用して作成され、`fwrite()` で書き込まれ、`fclose()` で閉じられます。
- 確かに $Txf が作成されます
- 不良クラスタはありません。これは仮想 (または RAM) ディスクです