Как узнать, занят ли файл или папка, например, Искатель занят копированием в него? - PullRequest
5 голосов
/ 14 января 2009

Я пробовал:

  1. Проверка FSCatalogInfo nodeFlags, чтобы увидеть, установлен ли kFSNodeForkOpenBit (с использованием kFSNodeForkOpenMask).

  2. Проверка, находится ли код создателя между kFirstMagicBusyFiletype и kLastMagicBusyFiletype.

  3. Проверка ExtendedFileInfo extendedFinderFlags для определения, установлен ли kExtendedFlagObjectIsBusy.

  4. Запуск GetFileInfo -ab с оболочки.

Все эти отчеты, что файл, в который копирует Finder, не открыт.

Использование lsof обнаруживает, что файл открыт, но (а) я не хочу вызывать lsof из своего приложения, и (б) я понимаю, что он опирается на частный API, поэтому, глядя на его Источник не поможет.

Ответы [ 5 ]

6 голосов
/ 08 января 2011

Сейчас для вас уже на 2 года позже, но я подумал, что если кто-нибудь найдет это позже, я бы заметил, что вы можете проверить дату создания файла. Средство поиска устанавливает его как kMagicBusyCreationDate (1946-02-14 08:34:56 +0000) во время копирования.

3 голосов
/ 12 мая 2012

Файловый бизнес

В Mac OS X v10.4 и более поздних версиях:

Искатель и целостность данных

Пока Finder создает копию файла (а не потом), копия имеет:

  • Код типа HFS brok
  • Код создателя HFS MACS

- вместе эти две вещи означают файловое дело .

MACS - это идентификатор Finder .

Если копия находится в файловой системе без поддержки таких атрибутов, как эти

Пока Finder создает копию файла (а не потом), копия имеет копию:

  • файл подчеркивания точки ._, содержащий необходимый расширенный атрибут (xattr).

Относящиеся

Почему создаются файлы подчеркивания точек ._ и как их избежать? - Задайте вопрос по-другому

Совместимость Finder с широким спектром файловых систем и операционных систем

Если копирование с использованием Finder прервано без изящества, то наличие brok MACS должно гарантировать, что поломка / бизнес распознается до:

  • все версии OS X
  • все версии Mac OS X
  • Mac OS 9 и некоторые более ранние классические версии операционной системы.
* * Пример тысяча шестьдесят-два

Файл big file.dmg без расширенного атрибута.

Перед копированием из JHFS + в пустой каталог example на томе, который использует MS-DOS (FAT32):

[macbookpro08:~] gjp22% date
Fri 11 May 2012 17:24:29 BST
[macbookpro08:~] gjp22% ls -h@al /Users/gjp22/Documents/uk/ac/brighton/collaborate/bigfile.dmg
-rw-r--r--  1 gjp22  staff   1.4G 11 May 17:20 /Users/gjp22/Documents/uk/ac/brighton/collaborate/bigfile.dmg
[macbookpro08:~] gjp22% xattr /Users/gjp22/Documents/uk/ac/brighton/collaborate/bigfile.dmg
[macbookpro08:~] gjp22% diskutil list | grep FAT32
   1:                 DOS_FAT_32 FAT32                   2.0 GB     disk3s1
[macbookpro08:~] gjp22% ls -h@al /Volumes/FAT32/example 
total 16
drwxrwxrwx  1 gjp22  staff   4.0K 11 May 17:24 .
drwxrwxrwx  1 gjp22  staff   4.0K 11 May 11:32 ..

После использования Finder для начала копирования, до завершения

brokMACS в пределах значения расширенного атрибута com.apple.FinderInfo:

[macbookpro08:~] gjp22% date
Fri 11 May 2012 17:25:08 BST
[macbookpro08:~] gjp22% ls -h@al /Volumes/FAT32/example
total 311320
drwxrwxrwx  1 gjp22  staff   4.0K 11 May 17:25 .
drwxrwxrwx  1 gjp22  staff   4.0K 11 May 11:32 ..
-rwxrwxrwx  1 gjp22  staff   4.0K 11 May 17:25 ._bigfile.dmg
-rwxrwxrwx@ 1 gjp22  staff   152M 11 May 17:25 bigfile.dmg
    com.apple.FinderInfo      32B 
[macbookpro08:~] gjp22% xattr -l /Volumes/FAT32/example/bigfile.dmg
com.apple.FinderInfo:
00000000  62 72 6F 6B 4D 41 43 53 00 00 00 00 00 00 00 00  |brokMACS........|
00000010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
00000020

После того, как Finder успешно завершит копирование

Этот расширенный атрибут удален:

[macbookpro08:~] gjp22% date
Fri 11 May 2012 17:29:19 BST
[macbookpro08:~] gjp22% xattr -l /Volumes/FAT32/example/bigfile.dmg
[macbookpro08:~] gjp22% ls -h@al /Volumes/FAT32/example
total 3000016
drwxrwxrwx  1 gjp22  staff   4.0K 11 May 17:29 .
drwxrwxrwx  1 gjp22  staff   4.0K 11 May 11:32 ..
-rwxrwxrwx  1 gjp22  staff   1.4G 11 May 17:20 bigfile.dmg
2 голосов
/ 11 февраля 2009

Мне кажется, что частично скопированные файлы имеют тип файла "brok" ​​и код создателя "MACS".

Я не верю, что Finder каким-либо образом помечает копии папок, которые он создает. «Затененное» представление строго ограничено процессом Finder, который выполняет копирование. Вы можете убедиться в этом, используя быстрое переключение пользователей во время копирования папки: как другой пользователь, копируемая папка имеет обычный вид в Finder, и вы можете открыть ее и посмотреть, как появляются подфайлы и папки. Похоже, что Finder не обнаруживает каких-либо различий в папке через AppleScript, и я не могу придумать какой-либо другой способ получить эту информацию.

0 голосов
/ 21 января 2009

Я не знаю точного ответа, но ... Ниже API-интерфейсов mgr файлов POSIX и Carbon есть еще один слой, который используется обоими. Он довольно близок к VFS и использует все строчные имена. Вы видите эти вызовы, когда вы отслеживаете вызовы FS с помощью команды "fs_usage", IIRC. Вы можете найти рабочую функцию в этих вызовах. К сожалению, они плохо документированы. Надеюсь, это поможет.

0 голосов
/ 18 января 2009

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

char* pathToFile;
int result;

result = open(pathToFile, O_RDWR | O_NONBLOCK | O_EXLOCK);
if (result != -1)
{
    //The file is not busy
    close(result);
}
else
{
    //The file is busy
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...