我在处理一个大型项目时遇到了一个非常奇怪的问题。我在一个分区上写了一堆相同大小的文件(尝试了通过创建的 RAM 磁盘和虚拟磁盘diskmgmt.msc
)。当没有足够的可用空间来容纳另一个文件时(如 报告GetDiskFreeSpaceExW
),我删除了一个(仅一个)先前创建的文件并写入新文件。然后,我删除另一个旧文件并写入一个新文件,无限期地写(因此,您可能会将分区视为大小相同的文件的环形缓冲区)。在一系列写入删除(从几百到几千)之后,我no free space
在编写新文件时遇到了错误(在此之前,GetDiskFreeSpaceExW
报告了足够的空间)。我请我的几个同事尝试在他们的硬件上重现该问题,但问题没有重新浮出水面。
为了澄清一点,这里是确切的算法:
- 选择文件大小(比如 S 字节)
- 使用 GetDiskFreeSpaceExW 检查可用空间
- 如果 free_space > S:写入大小为 S 的新文件并转到 2
- 否则:删除一个文件并转到 2
需要注意的是,我以 4096 字节大小的块将数据写入文件(问题可能会或可能不会重新出现,具体取决于块大小)。文件大小为 5MB。NTFS 分区大小为 21 MiB。集群大小为 512 B(同样,更改这些参数会影响结果)。使用这些参数,在创建第 684 个文件期间会发生故障。它不取决于我是使用 RAM 磁盘还是虚拟磁盘(因此,这不是特定实现的问题)。
我分析了故障后生成的磁盘映像转储,发现文件碎片严重。Chkdsk 在实验前后都没有报告任何问题。在系统日志中没有发现错误。
我的上网本(Dell Inspiron 1110)的可能相关参数:
- Pentium SU4100,相对较慢的双核 x64 CULV CPU (1.3 GHz)
- Windows 7 Ultimate x64 版
- 2 GB 内存
有谁知道发生了什么以及如何调试它?我在哪里可以找到更多信息?我已经没有想法了,我需要尽快解决这个问题......
UPD:问题发生在我写入文件数据(即write()
失败)时,而不是在我创建文件时。所以,看起来我并不缺少 MFT 条目。
UPD2:回答一些被问到的问题
- 该分区是一个新格式化的分区,因此没有文件的特定属性,没有目录结构,什么都没有
- 权限是默认的
- 没有 .lnk,没有硬链接 - _only_ 我写的文件
- 所有文件都写入根目录,不再创建目录
- 文件名只是文件的序号(即 1、2、3、...)
- 没有备用数据流,文件使用 `fopen()` 创建,使用 `fwrite()` 写入并使用 `fclose()` 关闭
- $Txf 确实被创建了
- 没有坏集群,这是一个虚拟(或 RAM)磁盘