Функция переименования C/C++ может использоваться для переименования каталога. Предположим, что ситуация ниже (для Linux) Каталог X содержит файлы A, B и C. X переименовывается в Y (используя функцию переименования C/C++). Во время выполнения операции питание Сервера/Диска отключается. Затем он перезапускается. Теперь есть вероятность того, что несколько файлов находятся в каталоге X, а другие — в Y. например Х : Б Y : А, С
@πάνταῥεῖ Есть std::filesystem::rename
.
Can a directory rename be partially executed..
Да, можно. И это случилось, это было нормально. В настоящее время файловые системы пытаются обрабатывать такие случаи. Чтобы получить более конкретный ответ, вам нужно указать тип файловой системы. Для продвинутых файловых систем «переименование» должно быть «атомарной» (быстрой, неблокирующей) операцией — ключевая часть изменяется, как один байт на базовом блочном устройстве. Server/Disk?
- вы должны указать, монтируются ли файловая система и базовое блочное устройство через какой-либо механизм общего доступа (netowrk?) или монтируются локально. Поскольку вопрос сейчас, он (путь) слишком широк. Может, зависит.
Это зависит от реализации, но для всех известных мне файловых систем переименование — это просто замена метки. Таким образом, переименование каталога ничем не отличается от операции переименования файла. И когда вы переименовываете файл и отключаете питание, вы никогда не получите два файла X и Y, каждый из которых имеет половину содержимого файла.
Rename — это только изменение имени. «Идентификатор» файла, а в Linux каталог — это файл, который содержит «ссылки» на другие файлы и каталоги, остается прежним!
Поскольку файловая система всегда напрямую зависит от физического блочного хранилища на любом оборудовании, всегда весь блок, в котором хранится метка, должен быть перезаписан и связан со структурой файловой системы.
Если между ними произойдет сбой питания, «файл каталога» может быть поврежден. Это означает, что задействовано больше, чем одна операция переименования!
НО: Современные файловые системы имеют множество возможностей для обнаружения и исправления таких ситуаций. НАПРИМЕР. ext4 имеет журнал в фоновом режиме. Если какой-либо доступ может быть прерван, в журнале есть информация о том, что эта операция начата, но не завершена. При монтировании такого раздела /fs ремонт происходит автоматически. Если это невозможно, fschk может выполнить эту работу.
Ситуация, когда были перемещены только «некоторые файлы», определенно никогда не возможна, потому что переименование каталога не создает новый каталог и не перемещает имена файлов/ссылки на идентификатор узла в новый каталог, это только новое имя для существующего каталога.
Как пользователь: просто используйте современные файловые системы, и в большинстве случаев все сбои при отключении питания могут быть устранены путем перезапуска. Вы можете найти свою файловую систему в «старой» или «новой» версии, но не между ними.