Проверьте размер файла во время записи в цикле

Я перебираю файлы в каталоге и записываю имена файлов в выходной файл с помощью 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

Использование Length собственностью myStream,

Вы также можете просто извлечь каталог как объект DirectoryInfo, а затем вызвать метод GetfileSystemInfos, который будет возвращать необходимый FileSystemInfo без необходимости создания другой переменной. Get FileSystemINfos также позволяет вам нативно отфильтровывать файлы bak.

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

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

Другие вопросы по тегам