Filestream.SetLength () Неверный параметр

Итак, я пытаюсь постепенно заполнять мультимедийное устройство и измерять скорость, и оно работает, пока я не перейду к записи данных от 75% до 95% (мы не заполняем его полностью)

Когда я перехожу к установке длины файла (пример: я пытаюсь создать файл размером 3,1 ГБ, когда на диске доступно 3,72 ГБ, я получаю следующее исключение

"Неверный параметр."

Трассировки стека

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.SeekCore(Int64 offset, SeekOrigin origin)
at System.IO.FileStream.SetLengthCore(Int64 value)
at System.IO.FileStream.SetLength(Int64 value)
at DiskSpeed.Write.WriteFileFromMemory(Byte[] buffer, String path, Int64 fileSize, Int32 currentIteration, Int32 totalIterations, CancellationToken ct)

Вот код

using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 8, FileOptions.WriteThrough | FileFlagNoBuffering))
{
    fs.SetLength(fileSize);
    .......
}

Я использую это для записи фрагментов на съемный носитель с шагом 25%, но после 75% я записываю только 20% фрагмент. Переход от 0 до 75% работает нормально, это последний фрагмент, который вызывает эту ошибку. Да, я дважды проверил размер файла, ЕСТЬ ПРОБЕЛ !!!

У кого-нибудь есть какие-либо идеи? Я в своем уме и не могу ничего найти в Интернете.


person Calvin    schedule 24.03.2015    source источник
comment
Согласно документации Поток должен поддерживать как запись, так и поиск, чтобы SetLength работал., но я не вижу ничего о поиске в вашем примере ... Не уверен, что это может помочь.   -  person Default    schedule 24.03.2015
comment
Каков точный тип исключения?   -  person Marcin Hoppe    schedule 24.03.2015
comment
что fileSize, когда вы звоните SetLength?   -  person Default    schedule 24.03.2015
comment
Marcin, исключение System.IO, Default, это не жестко запрограммировано, я обновил вопрос с подробностями. Это должно быть любое значение, при котором диск будет заполнен с 75% до 95%. Я использую класс DiskInfo для вычисления этого значения и проверил значения. И CanSeek, и CanWrite верны.   -  person Calvin    schedule 24.03.2015
comment
Что, черт возьми, такое FileFlagNoBuffering? И почему такой маленький буфер 8 байт?   -  person Dusan    schedule 24.03.2015
comment
Трассировка стека предполагает, что во время поиска возникло исключение. Я бы использовал что-то вроде Process Monitor или DiskMon от Sysinternals, чтобы проверить, какая операция ввода-вывода вызывает исключение.   -  person Marcin Hoppe    schedule 24.03.2015
comment
Итак, вы записали 75% файла, а затем установили размер потока на 75% от размера файла на диске? Также обратите внимание, что поток файлов генерирует только исключения IOException, NotSupportedException и ArgumentOutOfRangeException, где «Параметр неверен» звучит как исключение аргумента и, следовательно, не связано с файловым потоком.   -  person Ahmad    schedule 24.03.2015
comment
Ахмад, я заполнил диск на 75%, а затем подсчитал, сколько байтов нужно, чтобы заполнить диск до 90%, но когда я устанавливаю длину этого файла, я получаю исключение. Длина правильная, я дважды и трижды проверил этот код, значения верны !!!!!!!!!   -  person Calvin    schedule 24.03.2015
comment
Взгляните на: stackoverflow.com/a/1374156/461810 Это может быть проблематично, возможно, этот флаг вызывает проблему   -  person Dusan    schedule 24.03.2015
comment
Спасибо, Душан, мне пришлось на мгновение переключить внимание на другой проект, но я попробую это немного позже!   -  person Calvin    schedule 24.03.2015
comment
Когда вы используете опцию FileFlagNoBuffering (независимо от орфографической ошибки), ваша задача - обеспечить поиск позиции, которая является целым числом, кратным размеру сектора тома. 95% - не лучший показатель для этого.   -  person Hans Passant    schedule 24.03.2015
comment
Да, я собираюсь записать это на счет того, что не понимаю, что именно делает флаг. Я удалил это сейчас и буду читать об этом. Я не совсем осведомлен о внутренней работе СМИ.   -  person Calvin    schedule 24.03.2015


Ответы (1)


private const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;

Это было причиной проблемы. Спасибо, Душан!

person Calvin    schedule 24.03.2015