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

时间:2011-09-06 17:27:53

标签: c++ winapi ntfs

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

  

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

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

1 个答案:

答案 0 :(得分:9)

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

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

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

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