Ich habe einen Fehler, wenn meine App auf dem iPhone läuft, aber nicht, wenn sie auf dem Simulator läuft. Ich habe die Länge des Ausgangsverzeichnispfads verwendet, um den relativen Pfad einer Datei in/Documents zu extrahieren. Leider funktioniert das auf dem iPhone nicht immer korrekt, da das Präfix "/ private" zum Home-Pfad hinzugefügt wird. Mit oder ohne Präfix wird dieselbe Datei jedoch mit ok referenziert. Der folgende Code demonstriert diese Inkonsistenz. Was ist der Zweck von "/ privat" und wann wird es von iOS bereitgestellt?Was bedeutet das Präfix/private auf einem iOS-Dateipfad?
- (IBAction)testHomepath:(id)sender {
NSFileManager *fmgr = [NSFileManager defaultManager];
NSString *homePath = [NSString stringWithFormat:@"%@/Documents",NSHomeDirectory()];
NSString *dirPath = [homePath stringByAppendingPathComponent:@"TempDir"];
NSURL *dirURL = [NSURL fileURLWithPath:dirPath];
NSString *filePath = [dirPath stringByAppendingPathComponent:@"test.jpg"];
[fmgr createDirectoryAtPath:dirPath withIntermediateDirectories:NO attributes:nil error:nil];
[fmgr createFileAtPath:filePath contents:nil attributes:nil];
NSArray *keys = [[NSArray alloc] initWithObjects:NSURLNameKey,nil];
NSArray *files = [fmgr contentsOfDirectoryAtURL:dirURL includingPropertiesForKeys:keys options:0 error:nil];
NSURL *f1 = (files.count>0)? [files objectAtIndex:0] : 0;
NSURL *f2 = (files.count>1)? [files objectAtIndex:1] : 0;
bool b0 = [fmgr fileExistsAtPath:filePath];
bool b1 = [fmgr fileExistsAtPath:f1.path];
bool b2 = [fmgr fileExistsAtPath:f2.path];
NSLog(@"File exists=%d at path:%@",b0,filePath);
NSLog(@"File exists=%d at path:%@",b1,f1.path);
NSLog(@"File exists=%d at path:%@",b2,f2.path);
}
Folgendes wird in das Protokoll geschrieben, wenn es auf dem iPhone ausgeführt wird. I beabstandet manuell die Ausgabe die Differenz zwischen den Linien zu zeigen, 1 und 2.
2013-02-20 16:31:26.615 Test1[4059:907] File exists=1 at path: /var/mobile/Applications/558B5D82-ACEB-457D-8A70-E6E00DB3A484/Documents/TempDir/test.jpg
2013-02-20 16:31:26.622 Test1[4059:907] File exists=1 at path:/private/var/mobile/Applications/558B5D82-ACEB-457D-8A70-E6E00DB3A484/Documents/TempDir/test.jpg
2013-02-20 16:31:26.628 Test1[4059:907] File exists=0 at path:(null)
Die folgende in das Protokoll geschrieben wird, wenn auf dem Simulator (keine "/ private") ausgeführt wird:
2013-02-20 16:50:38.730 Test1[7224:c07] File exists=1 at path:/Users/kenm/Library/Application Support/iPhone Simulator/6.1/Applications/C6FDE177-958C-4BF5-8770-A4D3FBD281F1/Documents/TempDir/test.jpg
2013-02-20 16:50:38.732 Test1[7224:c07] File exists=1 at path:/Users/kenm/Library/Application Support/iPhone Simulator/6.1/Applications/C6FDE177-958C-4BF5-8770-A4D3FBD281F1/Documents/TempDir/.DS_Store
2013-02-20 16:50:38.733 Test1[7224:c07] File exists=1 at path:/Users/kenm/Library/Application Support/iPhone Simulator/6.1/Applications/C6FDE177-958C-4BF5-8770-A4D3FBD281F1/Documents/TempDir/test.jpg
Das Schlimmste, was Sie tun können, ist, irgendwelche Annahmen darüber zu treffen, was der Pfad zum Dokumentenverzeichnis Ihrer App ist oder sein wird. Eine bestimmte Länge für diesen Pfad zu erwarten, ist noch schlimmer. Ermitteln Sie einfach den Pfad Dokumente und entfernen Sie diesen aus dem vollständigen Pfad, um den relativen Pfad zu erhalten. – rmaddy
@maddy, ich nahm nicht eine bestimmte Länge an, nur dass der Pfad zu/Documents sich nicht ändern würde, was durch IOS-Hinzufügen/privat verletzt wird, wie Kevin Ballard unten darauf hingewiesen hat, ist nur ein Symlink. Ich komme aus Windows, wo ich das noch nie gesehen habe. Jetzt finde ich den Teilstring von/NSHomeDirectory()/Documents in jedem Pfad, den IOS mir gibt, und rufe die Pfadzeichenfolge danach den relativen Pfad auf. Siehst du irgendein Problem damit oder weißt du einen besseren Weg, den relativen Pfad zu bekommen? – KenM
Ihre Frage lautet: _Ich verwendete die Länge des Home-Verzeichnisses Pfad_. Sie sollten immer mit Pfaden arbeiten, die relativ zum Verzeichnis Documents sind. Sie dürfen niemals den vollständigen Pfad beibehalten. Wenn Sie nur relative Verzeichnisse haben, gibt es nichts zu verarbeiten. – rmaddy