Сохранять ссылку на файл после его перемещения в 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