Я работаю над проектом iOS, который поддерживает функцию обмена файлами iTunes. Целью является отслеживание в реальном временивходящих/изменяемых данных.
Я использую (немного модифицированный)класс DirectoryWatcherиз примера кода Apple. а также попробовал этот исходный код.
Данные представлены в формате NSBundle (*.bundle), размер некоторых пакетов составляет 100-500 МБ, в зависимости от их содержимого, некоторых видео/аудиоматериалов. В пакетах есть файл дескриптора на основе xml.
Проблема заключается в том, что любой из этих кодов выше запускает уведомлениеили что-то еще, когда данные только начинают копироваться, но не когда процесс копирования/изменения/удаления полностью завершен.
Далее пробовал:
проверка атрибутов файла:
NSDictionary *fileAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:[contURL path] error:nil];
BOOL fileBusy = [[fileAttrs objectForKey:NSFileBusy] boolValue];
поиск изменений размера файла
:
dispatch_async(_checkQueue, ^{
for (NSURL *contURL in tempBundleURLs) {
NSInteger lastSize = 0;
NSDictionary *fileAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:[contURL path] error:nil];
NSInteger fileSize = [[fileAttrs objectForKey:NSFileSize] intValue];
do {
lastSize = fileSize;
[NSThread sleepForTimeInterval:1];
fileAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:[contURL path] error:nil];
fileSize = [[fileAttrs objectForKey:NSFileSize] intValue];
NSLog(@"doing job");
} while (lastSize != fileSize);
NSLog(@"next job");
}
);
какие-либо другие решения?
Приведенное выше решение отлично подходит для bin-файлов, но не для .bundle (поскольку файлы .bundle на самом деле являются каталогами). Чтобы заставить его работать с .bundle, вы должны перебрать каждый файл внутри .bundle