Достижение этой цели вполне возможно при использовании комбинации «symlink» и «rename» вместе с промежуточным каталогом tmp.Следующий пример в оболочке, но вы могли бы легко перевести эту функциональность здесь, чтобы использовать базовые вызовы:
mkdir -p tmp/real_dir1 tmp/real_dir2
touch tmp/real_dir1/a tmp/real_dir2/a
# start with ./target_dir pointing to tmp/real_dir1
ln -s tmp/real_dir1 target_dir
# create a symlink named target_dir in tmp, pointing to real_dir2
ln -sf tmp/real_dir2 tmp/target_dir
# atomically mv it into ./ replacing ./target_dir
mv tmp/target_dir ./
Пример здесь взят из: http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/
Это сводится к (впсевдокод):
mkdir('./tmp');
mkdir('./tmp/real_dir1');
mkdir('./tmp/real_dir2');
symlink('./tmp/real_dir1', './target_dir')
symlink('./tmp/real_dir2', './tmp/target_dir')
rename('./tmp/target_dir', './target_dir')
Окончательное переименование здесь атомарное, поэтому действие будет либо успешным, либо неудачным, с точки зрения любого процесса, использующего каталог, действие является атомарным.