С помощью какого API вы выполняете согласованную по чтению файловую операцию в OS X, аналогично теневой службе томов Windows

Мы пишем приложение на C ++ / Objective C, работающее на OSX с версий 10.7 до настоящего времени (10.11).

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

Однако я не могу найти никакой документации или онлайн-статей, обсуждающих подобную функцию в OS X. Я знаю, что OS X не будет блокировать файл, когда он записывается, поэтому необходимо сделать что-то особенное, чтобы убедиться, что я не подобрать файл, который находится в процессе модификации?

Или Журнализованная файловая система делает ненужной какую-либо специальную обработку? Я обеспокоен тем, что если у меня есть один процесс, который создает или изменяет файлы (в пределах одного контекста, скажем, вызова fopen — очевидно, я не могу быть уверен в «полноте», если процесс записи открывает и закрывает файл неоднократно в течение того, что должно быть атомарной операцией), что процесс чтения закончится тем, что он получит «полуиспеченный» файл.

И если JFS гарантирует, что читатели видят только «целые» файлы, распространяется ли это на тома Fat32, которые могут быть подключены как внешние диски?

0

Решение

Несколько вещей:

  • В Unix, если вы открываете файл, если он заменены (в отличие от измененного), ваш дескриптор файла продолжает обращаться к открытому вами файлу, а не к его замене.
  • Многие приложения будут заменять, а не изменять файлы, используя такие вещи, как -[NSData writeToFile:atomically:] с YES за atomically:,
  • Какао и другие высокоуровневые фреймворки фактически блокируют файлы когда они пишут им, но эта блокировка является консультативной, а не обязательной, поэтому другие программы также должны подключиться к консультативной системе блокировки, чтобы быть затронутой этим.
  • Современный подход Координация файлов. Опять же, это добровольная система, к которой приложения должны подключиться.

Там нет такой функции, как то, что вы описали в Windows. Если стандартных подходов недостаточно для ваших нужд, вам придется создать что-то нестандартное. Например, вы можете сделать копию файла, который вас интересует, и после того, как ваша копия будет готова, сравнить ее с оригиналом, чтобы увидеть, был ли он изменен во время копирования. Если оригинал изменился, вам придется начать заново с новой операции копирования (или сдаться). Вы можете использовать Координацию файлов, чтобы, по крайней мере, минимизировать вероятность конфликта между сотрудничающими программами.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]