2012-01-13 17 views
9

Dato un oggetto NSFileWrapper (per un file o una directory), esiste un modo per ottenere il percorso completo per la posizione del file effettivo sul disco?Ottieni percorso per NSFileWrapper

[fileWrapper filename] restituisce solo il nome del file, non il percorso, quindi non è quello che sto cercando.

+1

Nel caso in cui si utilizzi 'NSDocument' .... http://www.zedkep.com/blog/index.php?/archives/197-Determining-a-full-file-path-from-an -NSFileWrapper.html –

+0

Sto usando 'NSDocument', e ho visto quel post. La mia unica preoccupazione è che il documento possa essere spostato in una nuova posizione mentre è aperto, e questo viene gestito in modo trasparente. Ma se provo ad accedere a un file dal vecchio percorso, si bloccherà. – Greg

+0

C'è una funzione di callback in 'NSDocument' per dirmi quando il file si muove fisicamente o viene rinominato? – Greg

risposta

3

No, non è possibile ottenere il percorso completo da NSFileWrapper.

+0

C'è un modo se si utilizza 'NSFileWrapper' in' NSDcoument'. Vedi la mia risposta. – hpique

1

Se si utilizza NSDocument è possibile ottenere il percorso di file wrapper di file regolari con un piccolo trucco.

Prima creare una sottoclasse NSFileWrapper e sovraccaricare i metodi di file regolari che ricevono un URL per memorizzarne una copia.

@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 

Quindi aggiungere questo NSFileWrapper categoria:

@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: restituirà l'url del nodo del file system, se disponibile, o l'URL del file originale, se non.

Il codice precedente presuppone che non si annidino i wrapper di file di directory.

+1

Come si sostituisce la classe standard NSFileWrapper per la sottoclasse personalizzata? –

+0

Inoltre, questo metodo garantisce poco in termini di URL restituito. Se l'autosalvataggio è abilitato, la posizione del file è sempre valida solo per la lettura o la scrittura, a seconda di quando si riesce a catturare l'istanza NSURL. Ho archiviato http://openradar.me/14692573 –

+0

Funzionerà ancora con le cose archiviate in iCloud ..? – cacau