Установить время создания файла только со стандартной библиотекой - PullRequest
7 голосов
/ 16 июня 2019

C ++ 17 включает новый и переносимый API для работы с файловыми системами (<filesystem>).

Моя программа распаковывает архив. Этот архив содержит файлы, каталоги и время создания для каждого файла. С новым API у меня есть портативное решение для создания каталогов (std::filesystem::create_directories), и я использую std::ofstream для создания файлов.

Можно ли использовать новый API для установки времени создания (или изменения) файла?

РЕДАКТИРОВАТЬ : время, которое обеспечивает архив - это секунды, начало в 1970.01.01 00:00:00 (время UNIX Epoch)

Ответы [ 2 ]

3 голосов
/ 16 июня 2019

Ответ на ваш вопрос ... сложен. Потому что C ++ должен быть C ++.

В самом техническом смысле ответ - да: std::filesystem::last_write_time может использоваться для установки последнего времени записи для файла .

Причина, по которой ответ неверен в более реалистическом смысле, заключается в том, что last_write_time принимает std::filesystem::file_time_type как свое время. И это проблематично.

Видите, эпоха для этого момента времени (который составляет 0 раз) ... определяется реализацией. Это может быть время UNIX (ноль - 1 января 1970 года в 00:00:00). Или это может быть что-то еще.

Поскольку это определяется реализацией, невозможно переносимо повернуть число секунд / минут / дней / и т. Д. Относительно некоторой известной эпохи (как, например, время в вашем архиве) в std::filesystem::file_time_type просто потому, что вы не знаете, как говорить file_time_type. Единственное, что вы действительно можете сделать, - это использовать существующие значения file_time_type s и настроить их на любое произвольное количество времени (или установить текущее время с помощью file_time_type::clock::now()). Но вы не можете установить время файла для некоторой известной абсолютной даты / времени.

C ++ 20, к счастью, закрывает эту дыру. system_clock потребуется для работы во времени UNIX, а file_time_type потребуется, чтобы иметь возможность std::chrono::clock_cast ed из / в любой тип, который может быть преобразован во время system_clock.

Но до тех пор, last_write_time не так полезен, как следовало бы ...

0 голосов
/ 16 июня 2019

Поскольку портативное является требованием: Нет

Это странно и скучно, но все же факт.

Боюсь, вам понадобится реализовать зависимые от платформы куски кода предварительной обработки.

#ifdef __WIN32
  #ifdef __WIN64
  #endif
#endif

#ifdef __unix__
#endif

#ifdef __<something>__
#endif

и т.д ... Не красиво.

Я нахожу ваш вопрос чрезвычайно актуальным из-за отсутствия поддержки чего-либо, поддерживаемого всеми операционными системами начиная с OS / 2 (или, возможно, даже дальше). Смешно притворяться, что его там нет, но вам придется пережить последствия того, что прошлые поколения не думали о будущем, а новое поколение стандартизаторов было очень осторожным и тщательным.

...