Сохранять ссылку на файл после его перемещения в objective-c?
У меня есть приложение Cocoa, которое хранит ссылку на мультимедийные файлы (изображения, видео и т.д.) на компьютере пользователя. Мне интересно, есть ли способ получить ссылку на этот файл другой, который использует путь к файлу, чтобы, если пользователь перемещает этот файл в другую папку на своем компьютере, я все равно буду знать, где он находится. В настоящее время я храню массив путей к файлам, которые возвращаются из стандартного диалога Cocoa:
-(void)addMultimediaDidEnd:(NSOpenPanel*)sheet
returnCode:(int)returnCode
contextInfo:(NSString *)contextInfo
{
if(returnCode == NSOKButton) {
[sheet orderOut:nil];
[self saveFiles:[sheet filenames]];
}
}
Ответы
Ответ 1
В OS X 10.6 (Snow Leopard) NSURL
можно преобразовать в URL-адрес ссылки на файл (используя -[NSURL fileReferenceURL]
), который ссылается на файл во всех ваших ходах во время работы вашего приложения. Если вы хотите сохранить эту ссылку на файл, используйте +[NSURL writeBookmarkData:toURL:options:error:]
, передавая данные закладок, сгенерированные с помощью -[NSURL bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error]
. Закладка может быть разрешена позже, когда +[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:]
передает данные закладки, возвращенные с +[NSURL bookmarkDataWithContentsOfURL:error:]
.
До OS X 10.6 такая же функциональность (минус некоторые сетевые тонкости) доступна через интерфейс AliasManager, интерфейс Carbon, к системе псевдонимов файлов OS X. Есть несколько оберток Objective-C поверх Alias Manager, которые делают его более удобным с Cocoa. Мое любимое дополнение Wolf Rentzsch к Chris Hanson BDAlias
(доступно на github).
Ответ 2
Вот быстрый пример использования закладок для отслеживания файлов по ходу:
- (NSData *)bookmarkFromURL:(NSURL *)url {
NSData *bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationMinimalBookmark
includingResourceValuesForKeys:NULL
relativeToURL:NULL
error:NULL];
return bookmark;
}
- (NSURL *)urlFromBookmark:(NSData *)bookmark {
NSURL *url = [NSURL URLByResolvingBookmarkData:bookmark
options:NSURLBookmarkResolutionWithoutUI
relativeToURL:NULL
bookmarkDataIsStale:NO
error:NULL];
return url;
}
Из https://github.com/ptrsghr/FileWatcher/blob/master/FileWatcherExample/Classes/FileWatcher.m