У меня есть программа, которая отвечает за сбор данных из системы сбора данных и добавление этих данных в очень большой (размер> 4 ГБ) двоичный файл. Перед добавлением данных программа должна проверить заголовок этого файла, чтобы убедиться, что метаданные в файле соответствуют собранным. Для этого я открываю файл следующим образом:
data_file = fopen (имя_файла, "rb +");
Затем я ищу начало файла, чтобы проверить заголовок. Когда это сделано, я ищу в конец файла следующим образом:
_fseeki64 (файл_данных, _filelengthi64 (файл_данных), SEEK_SET);
На этом этапе я записываю данные, которые были собраны с помощью fwrite (). Я внимательно проверяю возвращаемые значения из всех функций ввода / вывода.
Один из компьютеров (Windows 7 64 бит), на которых мы тестировали эту программу, периодически показывает состояние, при котором данные, по-видимому, были записаны в файл, но при этом не изменяется ни время последнего изменения файла, ни его размер. Если какой-либо из вызовов fopen (), fseek () или fwrite () завершится неудачно, моя программа сгенерирует исключение, которое приведет к прерыванию процесса сбора данных и регистрации ошибки. На этой машине ни одна из этих сбоев, кажется, не происходит. Что еще более загадочно, так это то, что, если в файловой системе хоста установлена точка восстановления, проблема исчезает только для повторного появления в будущем.
Мы пытались воспроизвести эту проблему на других машинах (32-разрядная операционная система Vista), но не смогли воспроизвести проблему (это не обязательно означает что-либо, поскольку проблема с самого начала носит прерывистый характер.
Кто-нибудь еще сталкивался с чем-нибудь подобным этому? Есть ли потенциальное лекарство?
Дополнительная информация
Я обнаружил, что ошибка возникает при вызове fflush () для файла и что ошибка win32, возвращаемая GetLastError (), равна 665 (ERROR_FILE_SYSTEM_LIMITATION). Поиск в Google по этой ошибке приводит к куче отчетов, связанных с «экстентами» для файлов сервера SQL. Я подозреваю, что существует некоторый ресурс журналирования, о котором сообщает файловая система, и это потому, что мы увеличиваем большой файл, открывая его, добавляя кусок данных и закрывая его. Сейчас я ищу понимания относительно этой конкретной ошибки с надеждой найти подходящее средство.