Атомное переименование, работает в Linux, есть ли способ эмулировать его в Windows и OSX? - PullRequest
2 голосов
/ 10 мая 2011

В Linux вы можете переименовать файл с перезаписью.Например, переименование -f file_a file_b Перезапишет file_b с file_a, и оно будет атомарным.

В OS / X кажется, что это должно было сработать, но оно глючит.Под виндой нет.В сетевых файловых системах - вероятно, нет.

Есть ли способ симулировать это поведение среди взаимодействующих процессов?

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

Однако в процессе все немного сложнее.Я мог бы сделать блокировку мьютекса всей машины, но это не решит проблему взаимодействия процессов на разных машинах.

Могу ли я смоделировать это с помощью файлов блокировки?Если да, то как мне сделать это надежно, чтобы в случае преждевременного завершения процесса он мог очиститься или я мог распознать файл блокировки, который больше не действителен, и удалить его?

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

РЕДАКТИРОВАТЬ: поддержка транзакций файловой системы NTFS устарела. Оставляя этот ответ по историческим причинам, но альтернативы здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/hh802690%28v=vs.85%29.aspx

НФТС поддерживает транзакции на ФС. Таким образом, вы не можете делать именно то, что вы хотите, но вы можете начать транзакцию, удалить файл и затем переименовать. http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

Я должен отметить, что для этого требуется Vista или выше.

0 голосов
/ 10 мая 2011

Передача окон, но mv -f - это атомарное переименование в BSD (и, вероятно, OSX), если target и source совместно используют одну и ту же файловую систему. Я полагаю, что это ограничение относится к linux, а также к операции переименования означает, что индекс перемещается в другой каталог, а индексы уникальны для файловой системы. Я не уверен, что вы пытаетесь предотвратить: два процесса выполняют одно и то же переименование, т. Е. Идентичный источник и место назначения?

...