Открыть файл, создать, если не существует, определить, создан ли - PullRequest
2 голосов
/ 22 мая 2019

Я хотел бы написать код, который выполняет следующее:

1) Откройте файл (для записи), создав файл, если он не существует.

2) Убедитесь, что файл существует во время выполнения какого-либо другого кода (удерживая файл открытым).

3) Закройте файл и удалите файл, если он был создан на шаге 1.

Упрощает ли какая-либо из функций файловой системы stdlib / boost POSIX / C ++ 17?

ПРИМЕЧАНИЕ. Решение, которое включает несколько вызовов open и дает недопустимые результаты, если файл создан / удален между ними, не является тем, который мне нужен.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Я не думаю, что это можно сделать переносимым способом, вам, вероятно, придется прибегнуть к API-интерфейсам для конкретной платформы.

Например, в Windows вы можете использовать CreateFile() с флагом CREATE_ALWAYS, и если файл успешно открыт, и последующий вызов GetLastError() возвращает 0 вместо ERROR_ALREADY_EXISTS, файл был создан заново, поэтому вызовите SetFileInformationByHandle(FileDispositionInfo) для включения флага FILE_DISPOSITION_INFO::DeleteFile в файле.Таким образом, когда все открытые дескрипторы файла будут закрыты, ОС автоматически удалит его.

Затем при необходимости можно прикрепить дескриптор файла к std::(i|o)fstream, если это необходимо.

0 голосов
/ 22 мая 2019

Поскольку логика отличается, если файл создан (как временный), вы можете сначала проверить, существует ли файл.Если нет, создайте его с помощью O_CREAT | O_EXCL и сохраните fd в unique_ptr/shared_ptr с пользовательским средством удаления, которое удаляет файл, в дополнение к закрытию fd.O_EXCL позволяет избежать гонки, приводящей к удалению дубликатов, и гарантирует, что вы действительно создали файл.Если вы ожидаете, что это будет весьма утверждало, вы можете проверить EEXIST и повторить попытку в этом случае.Если вам удастся удалить временный файл, открытый другой параллельной версией вашего вызова, он останется до тех пор, пока не будет закрыт файл.

...