unity的對(duì)各平臺(tái)地址操作

說(shuō)明unity的對(duì)地址操作時(shí),我們先來(lái)了解一下每個(gè)地址對(duì)應(yīng)的讀寫(xiě)功能以及位置。

Application.dataPath 是app程序包安裝路徑,此目錄只可讀。
Application.streamingAssetsPath 是app程序下的資源路徑,此目錄只可讀。
Application.temporaryCachePath 是app程序下的緩存目錄,臨時(shí)創(chuàng)建,適合用來(lái)存放臨時(shí)資源緩存,內(nèi)存不足是自動(dòng)清理。
Application.temporaryCachePath 是用戶偏好設(shè)置地址目錄。適合用于存儲(chǔ)一些本地持久化數(shù)據(jù)。

iOS

Application.dataPath????????????/var/containers/Bundle/Application/app sandbox/xxx.app/Data

Application.streamingAssetsPath /var/containers/Bundle/Application/app sandbox/test.app/Data/Raw

Application.temporaryCachePath /var/mobile/Containers/Data/Application/app sandbox/Library/Caches

Application.persistentDataPath??/var/mobile/Containers/Data/Application/app sandbox/Documents

iOS和Mac OS X不同于Windows,app都是在一個(gè)沙盒空間中運(yùn)行,每個(gè)app也有一個(gè)獨(dú)立的數(shù)據(jù)存儲(chǔ)空間,各app彼此不能互相訪問(wèn)、打擾。

dataPath是app程序包安裝路徑,app本身就在這里,此目錄是只讀的。streamingAssetsPath是dataPath下的Raw目錄。

app的獨(dú)立數(shù)據(jù)存儲(chǔ)目錄下有三個(gè)文件夾:Documents,Library和tmp。

Documents目錄,這個(gè)目錄用于存儲(chǔ)需要長(zhǎng)期保存的數(shù)據(jù),比如我們的熱更新內(nèi)容就寫(xiě)在這里。需要注意的是,iCloud會(huì)自動(dòng)備份此目錄,如果此目錄下寫(xiě)入的內(nèi)容較多,審核的可能會(huì)被蘋(píng)果拒掉。

Library目錄,這個(gè)目錄下有兩個(gè)子目錄,Caches和Preferences。

Caches是一個(gè)相對(duì)臨時(shí)的目錄,適合存放下載緩存的臨時(shí)文件,空間不足時(shí)可能會(huì)被系統(tǒng)清除,Application.temporaryCachePath返回的就是此路徑。我把熱更新的臨時(shí)文件寫(xiě)在這里,等一個(gè)版本的所有內(nèi)容更新完全后,再把內(nèi)容轉(zhuǎn)移到Documents目錄。

Preferences用于應(yīng)用存儲(chǔ)偏好設(shè)置,用NSUserDefaults讀取或設(shè)置。

tmp目錄,臨時(shí)目錄,存放應(yīng)用運(yùn)行時(shí)臨時(shí)使用的數(shù)據(jù)。

需要注意的是,以上無(wú)論臨時(shí)、緩存或者普通目錄,如果不需要的數(shù)據(jù),都請(qǐng)刪除。不要占用用戶的存儲(chǔ)空間,像微信就是壞榜樣。

下面是各路徑對(duì)應(yīng)的OC訪問(wèn)方法

app安裝路徑: [[NSBundle mainBundle] resourcePath]

app數(shù)據(jù)沙盒存儲(chǔ)根目錄: NSHomeDirectory()

Documents: NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)

Library:?????NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)

Caches:?????NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)

tmp:????????NSTemporaryDirectory()

Android

Application.dataPath??????????? /data/app/package name-1/base.apk

Application.streamingAssetsPath jar:file:///data/app/package name-1/base.apk!/assets

Application.temporaryCachePath /storage/emulated/0/Android/data/package name/cache

Application.persistentDataPath?? /storage/emulated/0/Android/data/package name/files

看Android上的路徑,跟iOS有點(diǎn)類似,簡(jiǎn)單說(shuō)一下。Android的幾個(gè)目錄是apk程序包、內(nèi)存存儲(chǔ)(InternalStorage)和外部存儲(chǔ)(ExternalStorage)目錄。

apk程序包目錄: apk的安裝路徑,/data/app/package name-n/base.apk,dataPath就是返回此目錄。

內(nèi)部存儲(chǔ)目錄: /data/data/package name-n/,用戶自己或其它app都不能訪問(wèn)該目錄。打開(kāi)會(huì)發(fā)現(xiàn)里面有4個(gè)目錄(需要root)

cache 緩存目錄,類似于iOS的Cache目錄

databases 數(shù)據(jù)庫(kù)文件目錄

files 類似于iOS的Documents目錄

shared_prefs 類似于iOS的Preferences目錄,用于存放常用設(shè)置,比如Unity3D的PlayerPrefs就存放于此

外部存儲(chǔ)目錄: 在內(nèi)置或外插的sd上,用戶或其它app都可以訪問(wèn),外部存儲(chǔ)目錄又分私有和公有目錄。

公有目錄是像DCIM、Music、Movies、Download這樣系統(tǒng)創(chuàng)建的公共目錄,當(dāng)然你也可以像微信那樣直接在sd卡根目錄創(chuàng)建一個(gè)文件夾。好處嘛,就是卸載app數(shù)據(jù)依舊存在。

私有目錄在/storage/emulated/n/Android/data/package name/,打開(kāi)可以看到里面有兩個(gè)文件夾cache和files。為什么跟內(nèi)部存儲(chǔ)目錄重復(fù)了?這是為了更大的存儲(chǔ)空間,以防內(nèi)存存儲(chǔ)空間較小。推薦把不需要隱私的、較大的數(shù)據(jù)存在這里,而需要隱私的或較小的數(shù)據(jù)存在內(nèi)部存儲(chǔ)空間。

下面是各路徑對(duì)應(yīng)的Java訪問(wèn)方法:

apk包內(nèi): AssetManager.open(String filename)

內(nèi)部存儲(chǔ): context.getFilesDir().getPath() or context.getCacheDir().getPath()

外部存儲(chǔ): context.getExternalFilesDir(null).getPath() or context.getExternalCacheDir().getPath()

理解了Android存儲(chǔ)的原理,最后來(lái)說(shuō)說(shuō)開(kāi)頭提到的bug,Application.temporaryCachePath/persistentDataPath返回空字符串。這其實(shí)因?yàn)闄?quán)限的原因,app沒(méi)有聲明訪問(wèn)外部存儲(chǔ)空間的權(quán)限,但是Application.temporaryCachePath/ ApplicationpersistentDataPath卻想返回外部存儲(chǔ)的路徑。這是Unity3D的bug,沒(méi)有權(quán)限本應(yīng)該拋出一個(gè)異?;蛘咤e(cuò)誤,讓開(kāi)發(fā)者知道原因。

經(jīng)反復(fù)測(cè)試發(fā)現(xiàn),有【外置SD卡】的設(shè)備上,如果聲明讀/寫(xiě)外部存儲(chǔ)設(shè)備的權(quán)限,會(huì)返回外部存儲(chǔ)路徑,不聲明則會(huì)返回內(nèi)部存儲(chǔ)路徑,這樣不會(huì)有問(wèn)題。而在【無(wú)外置SD卡】的設(shè)備上,不管是否聲明讀/寫(xiě)外部存儲(chǔ)設(shè)備的權(quán)限,Application.temporaryCachePath/persistentDataPath都返回外部存儲(chǔ)路徑,但是又沒(méi)有權(quán)限,就可能會(huì)導(dǎo)致返回null了,之所以說(shuō)可能是因?yàn)檫@個(gè)bug不是必現(xiàn),如果出現(xiàn)了設(shè)備重啟之后就好了,懷疑是linux設(shè)備mount問(wèn)題。但是出了問(wèn)題,我們不能跟用戶說(shuō)你重啟一下手機(jī)就好了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Windows

Application.dataPath:????????????應(yīng)用的appname_Data/

Application.streamingAssetsPath: 應(yīng)用的appname_Data/StreamingAssets

Application.temporaryCachePath: C:\Users\username\AppData\Local\Temp\company name\product name

Application.persistentDataPath:?? C:\Users\username\AppData\LocalLow\company name\product name

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 為什要積極參與讀書(shū)類文章的寫(xiě)作? 答:1、對(duì)于寫(xiě)作愛(ài)好者來(lái)說(shuō),閱讀是后期所有內(nèi)容輸出的基礎(chǔ),如情感、娛樂(lè)、社會(huì)觀點(diǎn)...
    餅看書(shū)閱讀 254評(píng)論 0 1
  • Check variable is object or function Check vairable is fu...
    yingjieg閱讀 498評(píng)論 0 0
  • yuanqian閱讀 115評(píng)論 0 0
  • 春夏之交,細(xì)雨黃昏中的江南錯(cuò)劍峰很美。雨不是線,不是點(diǎn),而是霧,若有若無(wú)地潤(rùn)進(jìn)金紅色的薄暮里。天光漸老,暮色在一個(gè)...
    白卷作詩(shī)閱讀 499評(píng)論 0 1
  • 相愛(ài)千年好似夢(mèng) 思念泣泣君移情 成夜空樓青燈苦 殤心逝愛(ài)空了痕
    愛(ài)你一生陪你一世閱讀 292評(píng)論 3 8

友情鏈接更多精彩內(nèi)容