2013-07-12 9 views
2

В настоящее время я пишу приложение для Android, которое должно работать с большим количеством файлов со своей стороны.Предоставляет ли fsync родительский каталог синхронизацию метаданных всех рекурсивных подкаталогов?

Недавно я столкнулся с несколькими проблемами потери данных или непоследовательности при обновлении или переименовании этих файлов. (Все эти файлы хранятся в нескольких подкаталогах из общего родительского/корневого каталога.)

После прочтения нескольких статей о fsync() я решил использовать его. Однако у меня было одно непонятное:

Вызывает ли вызов fsync() в родительском каталоге синхронизировать метаданные всех подкаталогов, рекурсивно?

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

Затем следует вызвать fsync() в каждом подкаталоге отдельно или вызвать fsync() в родительском каталоге, чтобы убедиться, что метаданные всех подкаталогов (и их дочерние каталоги рекурсивно) синхронизированы с физическое устройство?

В принципе идея состоит в том, чтобы сэкономить время, избегая нескольких вызовов fsync(). Или потребуется больше времени для fsync() в каталоге верхнего уровня по сравнению с fsync() в каждом отдельном подкаталоге? (Предполагая, что fysnc() в каталоге верхнего уровня синхронизирует все метаданные подкаталогов)

ответ

2

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

Если вы хотите, чтобы все содержимое было правильно синхронизировано, вы должны явно их синхронизировать.