在循环写入时检查文件大小

我循环遍历目录中的文件,并使用StreamWriter将文件名写入输出文件。 文件不能超过60K检查这个的最佳方法是什么? 现在,我在每个循环中创建一个新的FileInfo变量(如下面的代码所示)并检查其Length属性,如下代码所示:

foreach (var file in directories) { if (file.FullName.Contains("\\BAK\\")) continue; myStream.WriteLine(file.FullName); counter += 1; FileInfo myPaths = new FileInfo(outFile); if (myPaths.Length >= 60000) { //Do Procedure } } 

我在想,也许在写入之前计算每个字符串的长度会更快更简单。 也就是说,

 fileSz += file.FullName.Length if (fileSz >= 60000) // do procedure 

或许还有另一种选择?

如果通过传递路径构造StreamWriter ,则可以使用myStream.BaseStream.Length来确定文件的大小。 如果您通过向其传递流来构造StreamWriter ,那么您已经可以访问该流的Length属性。 :)当你可以查询流来查找时,不需要FileInfo或计算长度。 把事情简单化。 🙂

如果稍后您决定需要将输出文件从UTF-16更改为UTF-8(或其他编码),则Length属性仍然可以正常工作。

通常,C#字符串的大小(以字节为单位) 约为 2n + 20 ,其中n是字符串的长度。 您可以使用它来近似,但请记住在您的估计中包含WriteLine的换行符。

 fileSz += (2 * file.FullName.Length + 20 + Environment.NewLine.Length); if (fizeSz <= 59500 * 1024) ... // Keep it under 59.5k to be safe, also 1024 bytes per kb 

使用myStream Length属性。

您还可以将目录检索为DirectoryInfo对象,然后调用GetfileSystemInfos方法,该方法将本机返回您需要的FileSystemInfo,而无需创建另一个变量。 获取FileSystemINfos还允许您本机过滤掉bak文件

 var files = dir.GetFileSystemInfos("*.txt") 

http://msdn.microsoft.com/en-us/library/dd383457.aspx