使用NSURL访问包内的文件路径

时间:2015-09-18 00:33:28

标签: cocoa path

我需要访问文件"数据"在包文件内容中,该内容是另一个应用程序使用的项目文件。 包可以在任何可用卷上的任何位置。 在我的应用程序中,我要求用户找到他的项目,因此我获得了项目路径。 项目文件中的结构始终相同。所以我可以通过附加项目" base"来找到数据文件。路径与其内容目录的路径,直到数据文件。

但是当我打印路径时,获取所有目录,但包文件名被撤销。  如果我只打印基本路径,我会得到正确的路径,包括最后的包。就像它的状态不能出现在路径的中间。

我也尝试了[NSBundle bundleWithPath],但它返回nul。虽然查找程序不会将项目文件视为一个包而是一个包文件,但它只是绝望中的最后一次调用。

以下是代码:

` NSOpenPanel *getPath = [NSOpenPanel openPanel];
NSArray* fileTypes = [[NSArray alloc] initWithObjects:@"logicx", nil];
[getPath setCanChooseFiles:YES];
[getPath setCanChooseDirectories:NO];
[getPath setTreatsFilePackagesAsDirectories:NO];
[getPath setTitle:@"Select your Logic Pro X project file"];
[getPath setAllowedFileTypes:fileTypes];
[getPath setCanCreateDirectories:YES];



NSInteger clicked = [getPath runModal];
if (clicked == NSFileHandlingPanelOKButton) {
    for (NSURL *basePath in [getPath URLs]){

        NSURL *url = [NSURL URLWithString:(@"Alternatives/000/ProjectData") relativeToURL:basePath]; 

//"替代/ 000 / ProjectData的"是包文件的子路径

        NSURL *absURL = [url absoluteURL];


        NSLog(@"absURL = %@",absURL); `

项目包文件名是:" Track Patch.logicx"

如果我打印basePath,我会收到:file:///Volumes/Media/Music/Logic/Track%20Patch.logicx

如果我打印absURL这是必需的路径,我会absURL = file:///Volumes/Media/Music/Logic/Alternatives/000/ProjectData

包裹轨道补丁已经放弃了。

如果我打印网址(指针),我会得到absURL = Alternatives/000/ProjectData -- file:///Volumes/Media/Music/Logic/Track%20Patch.logicx

因此路径反转使我认为[NSURL URLWithString: relativeToURL:basePath];函数存在问题。那个--的意思是什么?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

URLWithString:relativeToURL:的文档说你需要一个尾随斜杠来处理它是一个目录。

  

"您可以通过提供文件夹的URL来构建文件的URL   作为基本路径(带斜杠)"

您可以使用URLByAppendingPathComponent方法解决此问题,例如:

NSURL *url = [basePath URLByAppendingPathComponent:@"Alternatives/000/ProjectData"];
  

"如果原始网址没有以正斜杠结尾,那么   pathComponent不以正斜杠开头,正斜杠是   插入在返回的URL的两个部分之间,除非   原始网址是空字符串。"

NSURL Documentation