iOS文件路径上的/ private前缀表示什么?

Ken*_*enM 30 iphone filepath ios

当我的应用程序在iPhone上运行时,我有一个错误,但是当它在模拟器上运行时却没有.我使用主目录路径的长度来提取/ Documents中文件的相对路径.不幸的是,这并不总能在iPhone上正常工作,因为前缀"/ private"正被添加到主路径中.但是,无论有没有前缀,都可以引用相同的文件.以下代码演示了这种不一致性."/ private"的目的是什么?它何时由iOS提供?

- (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);
}
Run Code Online (Sandbox Code Playgroud)

在iPhone上运行时,以下内容写入日志.我手动间隔输出以显示第1行和第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)
Run Code Online (Sandbox Code Playgroud)

在模拟器上运行时,以下内容写入日志(无"/ private"):

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
Run Code Online (Sandbox Code Playgroud)

Sko*_*tch 30

我从调试器中尝试了这个,并发现URLByResolvingSymlinksInPath"修复"了/private/添加.

(lldb) p (NSURL *)[NSURL fileURLWithPath:@"/private/var" isDirectory:YES]
(NSURL *) $1 = 0x1fd9fc20 @"file://localhost/private/var/"
(lldb) po [$1 URLByResolvingSymlinksInPath]
$2 = 0x1fda0190 file://localhost/var/

(lldb) p (NSURL *)[NSURL fileURLWithPath:@"/var" isDirectory:YES]
(NSURL *) $7 = 0x1fd9fee0 @"file://localhost/var/"
(lldb) po [$7 URLByResolvingSymlinksInPath]
$8 = 0x1fda2f50 file://localhost/var/
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,file://localhost/var这就是我们真正想要的.

因此,很明显这/private/var是一个符号链接/var.然而,@ Kevin-Ballard指出这不是真的.我确认他是正确的,并且/var/private/var(叹气)的符号链接

(lldb) p (NSDictionary *)[[NSFileManager defaultManager] attributesOfItemAtPath:@"/var" error:nil]
(NSDictionary *) $3 = 0x1fda11b0 13 key/value pairs
(lldb) po $3
$3 = 0x1fda11b0 {
    ...
    NSFileType = NSFileTypeSymbolicLink;
}

(lldb) p (NSDictionary *)[[NSFileManager defaultManager]   attributesOfItemAtPath:@"/private/var" error:nil]
(NSDictionary *) $5 = 0x1fda4820 14 key/value pairs
(lldb) po $5
$5 = 0x1fda4820 {
    ...
    NSFileType = NSFileTypeDirectory;
}
Run Code Online (Sandbox Code Playgroud)

所以URLByResolvingSymlinksInPath在这里做一些有趣的事情,但现在我们知道了.对于这个特殊的问题,URLByResolvingSymlinksInPath仍然听起来像是一个适用于模拟器和设备的好解决方案,并且如果有变化,将来还能继续工作.

  • `/ var`实际上也是iOS上`/ ​​private/var`的符号链接.`-URLByResolvingSymlinksInPath`可能是某种特殊的 - 包含它以提供更规范的路径. (2认同)
  • Apple文档"URLByResolvingSymlinksInPath"删除了前导的`/ private`.https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/doc/uid/20000301-SW32 (2认同)

Lil*_*ard 5

/var只是 的符号链接/private/var。因此,第一个路径是您尝试访问的逻辑路径。第二个是扩展了符号链接的相同路径。


cod*_*nd1 5

Swift 3中, URL具有standardizedFileUrl属性,该属性将删除任何符号链接并解析路径中的相关部分,例如./

撰写本文时,该文档几乎没有用,但看起来与NSURLstandardized属性等价。