2012-01-13 1 views
9

Учитывая объект NSFileWrapper (для файла или каталога), есть ли способ получить полный путь для размещения фактического файла на диске?Получить путь для NSFileWrapper

[fileWrapper filename] возвращает имя файла, а не путь, так что это не то, что я ищу.

+1

Если вы используете 'NSDocument' ... http://www.zedkep.com/blog/index.php?/archives/197-Determining-a-full-file-path-from-an -NSFileWrapper.html –

+0

Я использую 'NSDocument', и я видел этот пост. Моя единственная проблема заключается в том, что документ можно было перемещать в новое место, пока он открыт, и это обрабатывается прозрачно. Но если я попытаюсь получить доступ к файлу по старому пути, он потерпит крах. – Greg

+0

Есть ли функция обратного вызова в 'NSDocument', чтобы сообщить мне, когда файл физически перемещается или переименовывается? – Greg

ответ

3

Нет, нет способа получить полный путь от NSFileWrapper.

+0

Существует способ, если вы используете 'NSFileWrapper' в' NSDcoument'. См. Мой ответ. – hpique

1

Если вы используете NSDocument, вы можете получить путь к файлам с обычным файлом с небольшим взломом.

Сначала создайте подкласс NSFileWrapper и перегрузите обычные файлы, которые получают URL-адрес, чтобы сохранить его копию.

@implementation RMFileWrapper 

- (id) initWithURL:(NSURL *)url options:(NSFileWrapperReadingOptions)options error:(NSError *__autoreleasing *)outError { 
    if (self = [super initWithURL:url options:options error:outError]) { 
     self.originalURL = url; 
    } 
    return self; 
} 

- (BOOL) readFromURL:(NSURL *)url options:(NSFileWrapperReadingOptions)options error:(NSError *__autoreleasing *)outError { 
    BOOL successful = [super readFromURL:url options:options error:outError]; 
    if (successful) { 
     self.originalURL = url; 
    } 
    return successful; 
} 

@end 

Затем добавьте эту NSFileWrapper категорию:

@implementation NSFileWrapper(bestURLWithDocument) 

- (NSURL*) bestURLInDocument:(SBDocument*)document { 
    if (document.fileURL && self.filename) { 
     NSString* path = [document.fileURL.path stringByAppendingPathComponent:self.filename]; 
     return [NSURL fileURLWithPath:path]; 
    } else if ([self isKindOfClass:[RMFileWrapper class]]) { 
     RMFileWrapper *fileWrapper = (RMFileWrapper*) self; 
     return fileWrapper.originalURL;   
    } 
    return nil; 
} 

@end 

bestURLInDocument: будет возвращать URL узла файловой системы при наличии или исходный файл URL, если нет.

В приведенном выше коде предполагается, что вы не вставляете файлы каталога.

+1

Как вы подставляете стандартный класс NSFileWrapper для своего подкласса? –

+0

Кроме того, этот метод практически не гарантирует возвращаемый URL. Если функция автосохранения включена, расположение вашего файла всегда полезно для чтения или записи, в зависимости от того, когда вам удастся захватить экземпляр NSURL. Я зарегистрировал http://openradar.me/14692573 –

+0

Будет ли это работать с материалом, хранящимся в iCloud ..? – cacau