我循环遍历目录中的文件,并使用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
或许还有其他选择?
答案 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")
答案 3 :(得分:1)
使用Length
的{{1}}属性。