Размер файла после завершения File.WriteAllBytes на подключенном сетевом диске

Я использую File.WriteAllBytes для создания файла "somefile.txt". Означает ли это, что когда File.WriteAllBytes возвращается из выполнения, байты, переданные в File.WriteAllBytes, фактически находятся на диске? Например, я пишу количество X байтов с помощью File.WriteAllBytes("somefile.txt", bytes), а затем проверяю размер файла на диске, если размер равен bytes.length. Если оно равно, я предполагаю, что файл был полностью записан на диск.

Скажем, размер байта составляет 1,5 ГБ, и на машине требуется некоторое время, чтобы записать такой объем; диск, на который записан файл, является подключенным сетевым диском. Возможно ли, что File.WriteAllBytes завершает выполнение, но ОС продолжает записывать байты на диск?


person Developer Marius Žilėnas    schedule 28.04.2016    source источник
comment
Я так не думаю, так как File.WriteAllBytes закрывает файл после записи байтов   -  person Pikoh    schedule 28.04.2016
comment
@Pikoh Ожидает ли метод close (), пока переданные байты действительно записываются на диск?   -  person Developer Marius Žilėnas    schedule 28.04.2016
comment
Я думаю close сначала копирует все данные, записанные в буфер, на диск, а уже после этого освобождает все ресурсы. Я не верю, что у него есть способ проверить, что байты написаны физически, но я думаю, что это так.   -  person Pikoh    schedule 28.04.2016
comment
В любом случае.. почему ты спрашиваешь об этом? Если у вас есть конкретная проблема, я думаю, вы должны спросить об этой проблеме   -  person Pikoh    schedule 28.04.2016
comment
@Pikoh Я пишу файлы на подключенный сетевой диск. Чтобы показать, что файл записан полностью, я сразу после вызова File.WriteAllBytes беру DateTime.Now и помещаю его в свойство WritingEnded. Здесь я предполагаю, что после возврата File.WriteAllBytes байты фактически находятся на диске, т. е. WriteHasEnded. Я хочу избавиться от этого предположения :).   -  person Developer Marius Žilėnas    schedule 28.04.2016


Ответы (1)


Да, это совершенно нормально, что ОС может (или не может) фактически продолжать запись на диск после завершения записи в вашем программном API. Однако это буквально не ваша забота. Если вы запросите размер, вы получите ожидаемый и правильный размер, который вы записали, даже если ваша ОС использовала кеш записи . Эти процессы абстрагируются ОС за вас, так что не беспокойтесь.

Но, как вы упомянули сетевые диски в своем комментарии: обычно это не относится к сетевым дискам. Потому что ОС не может просто использовать кеш записи и завершить выполнение записи асинхронно. (Сеть может неожиданно выйти из строя и т. д.)

person Num Lock    schedule 29.04.2016
comment
Тэ за ответ. Это подключенный сетевой диск. В этом случае я не должен беспокоиться о неправильном размере? :) - person Developer Marius Žilėnas; 29.04.2016
comment
Если ваша ОС сообщает вам, что она закончила запись ваших данных без каких-либо ошибок, вы можете ожидать, что это произошло. - person Num Lock; 29.04.2016
comment
Чтобы быть параноиком, мне просто нужно использовать FileInfo и получить размер файла после того, как элемент управления вернется из выполнения File.WriteAllBytes. :-F По крайней мере File.WriteAllBytes является синхронным (по крайней мере, там написано stackoverflow.com/a/16746598/1737819 , stackoverflow.com/a/15467185/1737819 ) и блокирует выполнение на некоторое время. - person Developer Marius Žilėnas; 29.04.2016