2015-09-18 51 views
1

我需要訪問包文件內的文件「數據」,這是另一個應用程序使用的項目文件。 該軟件包可以位於任何可用卷的任何位置。 因此,在我的應用程序中,我要求用戶找到他的項目,因此我獲得了項目路徑。 項目文件內部的結構總是相同的。所以我可以通過將項目「base」路徑附加到其內容目錄的路徑直到數據文件來找到數據文件。使用NSURL訪問包內的文件路徑

但是,當我打印路徑獲取所有目錄很好,但包文件名稱被撤回。 如果我只打印基本路徑,我會在最後得到包含軟件包的正確路徑。就像它的狀態不能出現在路徑中間一樣。

我也試過[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); ` 

項目包文件名的子路徑:「跟蹤補丁。 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];功能的問題。順便說一句,--是什麼意思?

任何幫助將不勝感激。

+0

我真的很困惑,你問什麼。是‘替代/ 000/ProjectData的’你想看看包裝內的子路徑? –

+0

是exaclty,對不起,如果我沒有clrear不過,我要編輯帖子來說明這一點,謝謝 – user306147

回答

0

URLWithString:relativeToURL:的文檔說,你需要一個尾部的斜槓來處理它是一個目錄。

「你可以通過提供該文件夾的網址 爲基礎路徑(以斜槓)構建的文件的URL」

您可以通過使用URLByAppendingPathComponent方法來代替,像解決這個所以:

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

「如果原來的URL不以正斜槓結束, pathComponent不以正開始斜槓,正斜槓是 插入到返回的URL的兩部分之間,除非 原始URL是空字符串。「

NSURL Documentation

+1

謝謝Justin,它解決了它;)並再次感謝您花時間解釋爲什麼我的函數不合適! – user306147