Какие факторы могут привести к ошибке Win32 665 (ограничение файловой системы)? - PullRequest
5 голосов
/ 06 сентября 2011

Я поддерживаю приложение, которое собирает данные из регистратора данных и добавляет эти данные в конец двоичного файла. Природа этой системы заключается в том, что файл может расти большими (> 4 гигабайтами) маленькими шагами за раз. Один из пользователей моего приложения видел случаи на его NTFS-разделе, где попытки добавления данных не увенчались успехом. Ошибка сообщается в результате вызова fflush (). Когда это происходит, возвращаемое значение для GetLastError () равно 665 (ERROR_FILE_SYSTEM_LIMITATION). MSDN дает следующее описание для этой ошибки

Запрошенная операция не может быть завершена из-за ограничения файловой системы

Поиск этого кода ошибки в Google дает результаты, связанные с сервером SQL с ОЧЕНЬ большими файлами (десятки гигабайт), но в настоящее время наш файл намного меньше. У этого пользователя не было возможности увеличить размер файла до 10 гигабайт. Мы можем временно исправить ситуацию, когда мы делаем какую-то операцию (например, копирование файла), которая вызывает какое-то переписывание в файловой системе. К сожалению, я не уверен, что происходит, чтобы поставить нас в таком состоянии в первую очередь. Какие конкретные условия в файловой системе NTFS могут привести к сообщению об этой конкретной ошибке при вызове fflush ()?

1 Ответ

9 голосов
/ 06 сентября 2011

Похоже, что вы достигли предела фрагментации файла. Другими словами, каждый сброс создает новый экстент (фрагмент) файла, и файловая система с трудом находит место для отслеживания списка фрагментов. Это объясняет, почему копирование файла помогает - он создает новый файл с меньшим количеством фрагментов.

Другая вещь, которая, вероятно, сработает, - это дефрагментация файла (используя утилиту Sysinternals contig, вы можете сделать это, пока она используется). Вы также можете использовать contig, чтобы указать количество фрагментов в файле. Я предполагаю, что это порядка миллиона.

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

Если вы храбры (и у вашего процесса есть права администратора), вы можете самостоятельно дефрагментировать файл с помощью нескольких вызовов API: http://msdn.microsoft.com/en-us/library/aa363911(v=VS.85).aspx

...