Как проверить, завершена ли std::файловая система::копирование?

#c #ubuntu #std-filesystem

Вопрос:

Копирование файлов из каталога в другой каталог с помощью этого кода

 auto const copyOption = std::filesystem::copy_options::recursive | std::filesystem::copy_options::skip_symlinks;
std::filesystem::copy("/mnt/iso", "/mnt/usb", copyOption);
 

Копирование больших файлов может занять много времени.
Итак, как проверить, когда копирование завершено ?

Комментарии:

1. Разве функция не блокируется? Он должен вернуться только после завершения копирования.

2. Хотя я не проверял спецификацию C , ничто, например, в этой copy ссылке не упоминает, что она синхронна или асинхронна, поэтому я бы предположил, что по умолчанию она синхронна (т. Е. Блокируется и возвращается только после завершения). Вы пробовали использовать его, а также определять время и проверять, когда он вернется?

3. но std::filesystem::copy не имеет возвращаемого значения, поэтому я не знаю, как его контролировать

4. Игрушка не «контролирует» это. Вы вызываете его, он копирует файл (или каталог), и он заканчивается, когда все закончено.

5. *Игрушка -> Ты (я имею в виду)

Ответ №1:

Как проверить, завершена ли std::файловая система::копирование?

Вызов функции заканчивается либо (1) возвратом, либо (2) запуском, либо (3) завершением программы.

Если выполнение программы переходит к следующему оператору (или следующему родственному выражению), то вы знаете, что вызов функции завершился возвращением (1). Если выполнение продолжается, чтобы развернуться и в конечном итоге входит в catch блок, то вы знаете, что функция завершилась (2) выбрасыванием. Если программа больше не запускается, то вы знаете, что функция (3) завершила программу ( std::filesystem::copy не будет делать это напрямую, хотя это может произойти, если она запустится, не будучи пойманной). Если ничего из этого не произошло, то вы знаете, что вызов функции еще не закончился.

Например, попробуйте отключить USB-ключ сразу после завершения копирования, это займет на одну или две минуты больше, если у вас большие файлы

В C нет стандартного способа проверить, когда данные были физически записаны на устройство.

Вы отметили [ubuntu], поэтому вас может заинтересовать fsync функция в стандарте POSIX. Вы не можете использовать его в сочетании с std::filesystem::copy ; вместо этого вам нужно будет использовать другие функции управления файлами POSIX. fsync должно гарантировать, что все записи были переданы ядром на устройство. С этого момента вы полагаетесь на аппаратное обеспечение.

Комментарии:

1. Но поскольку функция копирования синхронна , даже если программа переходит к следующему оператору, копирование не завершается . Например, попробуйте отключить USB-ключ сразу после завершения копирования, это займет на одну или две минуты больше, если у вас большие файлы

2. Если copy() ОС просто запрашивает запуск копии, а фактическая копия выполняется в фоновом режиме, то вы никак не можете запросить ее статус с std::filesystem помощью функций. Поищите решение для конкретной платформы, например, любые собственные функции копирования ОС, которые предоставляют уведомления о состоянии.