Проверьте размер файла во время записи в цикле
Я перебираю файлы в каталоге и записываю имена файлов в выходной файл с помощью StreamWriter. Размер файла не может превышать 60 КБ. Как лучше всего это проверить? Теперь я создаю новую переменную 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 ответа
Если вы построили 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
Вы также можете просто извлечь каталог как объект DirectoryInfo, а затем вызвать метод GetfileSystemInfos, который будет возвращать необходимый FileSystemInfo без необходимости создания другой переменной. Get FileSystemINfos также позволяет вам нативно отфильтровывать файлы bak.
var files = dir.GetFileSystemInfos("*.txt")