С помощью какого API вы выполняете согласованную по чтению файловую операцию в OS X, аналогично теневой службе томов Windows
Мы пишем приложение на C++/Objective C, работающее на OSX с версий 10.7 до настоящего времени (10.11).
Под окнами существует концепция теневого файла, которая позволяет вам читать файл в том виде, в каком он существует в определенный момент времени, не беспокоясь о других процессах, записывающих этот файл в промежуточный период.
Тем не менее, я не могу найти никакой документации или онлайн-статей, обсуждающих подобную функцию в OS X. Я знаю, что OS X не будет блокировать файл во время записи, поэтому необходимо сделать что-то особенное, чтобы убедиться, что я не подобрать файл, который находится в процессе изменения?
Или Журнализованная файловая система делает ненужной какую-либо специальную обработку? Я обеспокоен тем, что если у меня есть один процесс, который создает или изменяет файлы (в пределах одного контекста, скажем, вызова fopen - очевидно, я не могу быть уверен в "полноте", если процесс записи открывает и закрывает файл неоднократно в течение того, что должно быть атомарной операцией), что процесс чтения закончится тем, что он получит "полуиспеченный" файл.
И если JFS гарантирует, что читатели видят только "целые" файлы, распространяется ли это на тома Fat32, которые могут быть подключены как внешние диски?
1 ответ
Несколько вещей:
- В Unix после открытия файла, если он заменен (в отличие от измененного), дескриптор файла продолжает обращаться к открытому файлу, а не к его замене.
- Многие приложения будут заменять, а не изменять файлы, используя такие вещи, как
-[NSData writeToFile:atomically:]
сYES
заatomically:
, - Какао и другие высокоуровневые фреймворки фактически блокируют файлы при записи в них, но эта блокировка является консультативной, а не обязательной, поэтому другие программы также должны подключиться к консультативной системе блокировки, чтобы быть затронутой этим.
- Современный подход - координация файлов. Опять же, это добровольная система, к которой приложения должны подключиться.
Там нет такой функции, как то, что вы описали в Windows. Если стандартных подходов недостаточно для ваших нужд, вам придется создать что-то нестандартное. Например, вы можете сделать копию файла, который вас интересует, и, после того, как ваша копия будет готова, сравнить ее с оригиналом, чтобы увидеть, был ли он изменен во время копирования. Если оригинал изменился, вам придется начать заново с новой операции копирования (или сдаться). Вы можете использовать Координацию файлов, чтобы, по крайней мере, минимизировать вероятность конфликта между сотрудничающими программами.