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

时间:2014-12-31 22:58:32

标签: c# filesize

我循环遍历目录中的文件,并使用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

或许还有其他选择?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

通常,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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

使用Length的{​​{1}}属性。