iOS的相對路徑和絕對路徑

2022-03-20 10:12:12 字數 3139 閱讀 4018

ios程式有固定的檔案訪問限制,只能在自己的沙盒內。

uiimage *img=[uiimage imagenamed:@"cellicon.png"];

這段**從相對路徑載入了乙個png資源作為uiimage物件,沒有任何問題。因為它在內部已經偷偷得幫你把路徑轉化為相對路徑了,你還不知道吧!

接下來,如果要載入一些自定義格式的檔案或者資料,就會出現相對路徑和絕對路徑的問題。比如

nsfilehandle

*filehandle=[

nsfilehandlefilehandleforreadingatpath:newpath];

newpath為乙個字串路徑,這裡的路徑你卻不能像上面那樣

nsfilehandle

*filehandle=[

nsfilehandlefilehandleforreadingatpath:@"test.txt"];

這樣系統是找不到檔案的,因為這裡需要的是檔案的絕對路徑,而@「test.txt」完全是無效的。

這個時候就需要nsbundle的幫忙了,這個類專門用來負責路徑轉化等等功能那。大家都知道ios專案雖然在xcode下可以建立資料夾結構,但是實際上它是沒有檔案結構概念的,所以此時假如要載入放在專案目錄下的test.txt檔案,完整的**應該是這樣

方法1:

nsstring

*newpath=[

nsstringstringwithformat:

@"%@%@%@"

,[[nsbundlemainbundle]resourcepath],

@"/"

,path];

nslog(@"url=%@",newpath);

nsfilehandle *filehandle=[nsfilehandle

filehandleforreadingatpath:newpath];

此處[nsbundle

nsstringstringwithformat:

@"%@%@%@"

,[[nsbundlemainbundle]resourcepath],

@"/"

,path];這麼簡單的字串拼接,我就不多說了,

support/iphone

控制台輸出拼接後完整檔案絕對路徑:

support/iphone

方法2:

nsstring *newpath=[[nsbundle mainbundle] pathforresource:@"test" oftype:@"txt"];

nsfilehandle *filehandle=[nsfilehandle

filehandleforreadingatpath:newpath];

[[nsbundle mainbundle] pathforresource:@"test" oftype:@"jat"];前面的就不再介紹了,pathforresource方法有兩個引數,前面這個為檔名,後面那個oftype就是檔案型別,也就是檔案字尾。這裡把檔名和字尾分開了,如果這是你得到的是乙個完整的檔名如:@「test.txt」,那麼你得自己想辦法把檔名和字尾分開了。

要特別說明,此處的檔案字尾是不需要「.」的,如果寫成@「.jat」是錯誤的,載入檔案會失敗。

//獲取程式documents目錄路徑

nsarray

*paths

=nssearchpathfordirectoriesindomains(nsdocumentdirectory,nsuserdomainmask, yes);

nsstring

*documentsdirectory

=[paths objectatindex:0];

//nshomedirectory();

//獲取程式tmp目錄路徑

nstemporarydirectory();

//獲取程式應用包路徑

[[nsbundle mainbundle] resourcepath];

或[[nsbundle mainbundle] pathforresource:

@"info

"oftype:

@"txt"];

複製**

初學ios開發的同學,不管是自己寫的,還是貼上的**,或多或少都寫過下面的**

[[nsbundle mainbundle] pathforresource:@"

somefilename

" oftype:@"

yourfileextension

"];[yourviewcontroller initwithnibname:"

yourviewcontroller

" bundle:nil];

可是你知道這裡的bundle到底是個啥玩意呢?!

bundle簡單地講,就是乙個內部結構按照標準規則組織的特殊目錄

檔案顯示給我們,其實是因為這個bundle自身也是乙個package,而mac系統會把所有的package當做乙個檔案來對待,顯示給使用者,從而防

止使用者誤操作導致程式檔案損壞或丟失。至於bundle和package有什麼區別,就不在這裡展開說明了,本文後面所說的bundle都會被mac系統

視為package。

現在我們已經知道了,原來我們開發的應用程式,最後都會成為乙個bundle,那麼就不難理解為什麼很多資源檔案載入大多是通過bundle來進行的了,從bundle進行檔案載入實際就是通過應用自己所在的資料夾進行載入。

不過緊接著我們又會產生好幾個疑問:

1 為什麼不直接使用檔案路徑的方式來讀取資源檔案呢?

2 為什麼還會存在pathforresource:oftype:這個方法,難道說我們在開發的時候還不能確定這些檔案在哪兒嗎?

而bundle對ios開發者來講,最大的方便就是可以非常簡單地讓自己的應用國際化,在不同的語言不同的地區,載入不同的資源檔案,顯示不同的語

言文字,而實現這些只需要我們嚴格按照bundle的要求進行資源檔案的存放即可,而不需要寫大量**判斷地區語言。遵循的方法也很簡單,只需要我們建立

對應的"本地化資料夾"即可,例如我們要同時讓"pic.png"在中文和英文下顯示不同的內容,只需要建立兩個本地化資料夾zh.lproj和

en.lproj,分別放入同名但內容不同的"pic.png"即可。

相對路徑絕對路徑

前兩天突然發現自己一直以來對相對路徑絕對路徑的理解都是錯的,於是趕緊查了相關資料。1.絕對路徑 絕對路徑是指檔案在硬碟上真正存在的路徑。例如 bg.jpg 這個是存放在硬碟的 e book 網頁布局 第2章 目錄下,那麼 bg.jpg 這個的絕對路徑就是 e book 網頁布局 第2章 bg.jpg...

絕對路徑 相對路徑

一 基本概念 1 相對路徑 相對於當前檔案的路徑。網頁中表示路徑一般使用這個方法。二 相對路徑常見的寫法 代表目前所在的目錄。開頭 代表根目錄。根目錄下有test1資料夾和image image1.jpg,test1下有index1.html檔案和test2資料夾。test2資料夾下有index2....

iOS的相對路徑和絕對路徑

ios程式有固定的檔案訪問限制,只能在自己的沙盒內。uiimage img uiimage imagenamed cellicon.png 這段 從相對路徑載入了乙個png資源作為uiimage物件,沒有任何問題。因為它在內部已經偷偷得幫你把路徑轉化為相對路徑了,你還不知道吧!接下來,如果要載入一些...