Для конкретной домашней работы я реализую базовую систему хранения данных, используя последовательные файлы по стандарту C, которые не могут загружать более 1 записи за раз. Итак, основная часть - это создание нового файла, в котором хранятся результаты того, что мы делаем с исходными записями. Переименован предыдущий файл, а новый - под рабочим именем. Код скомпилирован с MinGW 5.1.6 в Windows 7.stdio's remove() не всегда удаляется вовремя
Проблема в том, что эта конкретная версия кода (у меня почти идентичные версии этого плавающего вокруг моих функций) не всегда удаляет старый файл, поэтому переименование не выполняется, и, следовательно, сохраненные данные обрываются fopen().
FILE *archivo, *antiguo;
remove("IndiceNecesidades.old"); // This randomly fails to work in time.
rename("IndiceNecesidades.dat", "IndiceNecesidades.old"); // So rename() fails.
antiguo = fopen("IndiceNecesidades.old", "rb");
// But apparently it still gets deleted, since this turns out null (and I never find the .old in my working folder after the program's done).
archivo = fopen("IndiceNecesidades.dat", "wb"); // And here the data gets wiped.
В принципе, каждый раз, когда .old ранее существует, есть шанс, что он не удален во времени для переименования(), чтобы успешно вступили в силу. Нет возможных конфликтов имен как внутри, так и снаружи.
Странно, что только с этим конкретным файлом. Идентичные фрагменты, кроме имени, измененного на Necesidades.dat (который происходит в трех разных функциях) работают отлично.
// I'm yet to see this snippet fail.
FILE *antiguo, *archivo;
remove("Necesidades.old");
rename("Necesidades.dat", "Necesidades.old");
antiguo = fopen("Necesidades.old", "rb");
archivo = fopen("Necesidades.dat", "wb");
Любые идеи о том, почему это произошло, и/или, как я могу гарантировать удалить() команда вступила в силу по времени переименования() выполняется? (Я думал просто использовать цикл while для принудительного вызова remove() снова, пока fopen() возвращает ненулевой указатель, но это звучит как попрошайничество для сбоя из-за переполнения ОС с помощью запросов на удаление или что-то в этом роде.)
Вы проверяете возвращаемое значение удаления? И есть ли способ открыть файл, когда вы пытаетесь его удалить? – Cascabel
Remove не показывает проблем (и фактически удаляет файл, просто делает это слишком поздно), переименование получается «Permission Denied» (что является причиной того, что .old все еще существует, проверяется с помощью теста fopen()). Ни в коем случае нельзя открывать файл. – Kyte
Да, я подумал, что вы не упустили что-то очевидное, но это стоило выстрела. – Cascabel