哪些因素可能导致Win32错误665(文件系统限制)?

Jon*_*ein 5 c++ winapi ntfs

我维护一个应用程序,它从数据记录器收集数据并将该数据附加到二进制文件的末尾.该系统的本质是文件可以一次增大(> 4千兆字节)小步骤.我的应用程序的用户在他的NTFS分区上看到了附加数据尝试失败的情况.由于调用fflush()而报告错误.发生这种情况时,GetLastError()的返回值为665(ERROR_FILE_SYSTEM_LIMITATION).MSDN 对此错误给出以下描述

由于文件系统限制,无法完成请求的操作

在谷歌上搜索此错误代码会产生与SQL服务器相关的结果,其中包含非常大的文件(数十千兆字节)但是,目前,我们的文件要小得多.此用户无法使文件增长超过10千兆字节.当我们执行某些操作(如复制文件)时,我们可以暂时纠正这种情况,这会强制在文件系统中进行某种重写.不幸的是,我不确定是什么让我们首先处于这种状态.NTFS文件系统中的哪些特定条件会导致在调用fflush()时报告此特定错误?

Gab*_*abe 9

这听起来像你已经达到文件碎片的限制.换句话说,每次刷新都会创建文件的新范围(片段),并且文件系统很难找到跟踪片段列表的位置.这可以解释为什么复制文件有帮助 - 它创建一个包含较少片段的新文件.

另一件可能contig有用的事情是对文件进行碎片整理(使用Sysinternals的实用程序,你可以在使用它时这样做).您还可以使用它contig来告诉您文件有多少个片段.我猜这是一百万的订单.

如果你必须经常刷新文件并且不能对它进行碎片整理,你可以做的就是首先创建相当大的文件(一次性分配空间),然后写入文件的连续字节而不是附加.

如果你很勇敢(并且你的进程具有管理员访问权限),你可以通过几个API调用自己对文件进行碎片整理:http://msdn.microsoft.com/en-us/library/aa363911(v = VS.85)的.aspx