一读宙、文件與路徑——2彻秆、unity路徑特點(diǎn)寫法和文件讀寫全攻略

一、Unity中各路徑和目錄的對(duì)應(yīng)關(guān)系

image.png

其中结闸,安卓中的路徑是有兩種分支的


image.png

在打包面板中唇兑,有個(gè)Write Access
當(dāng)我們選擇Internal Only就是表示沙盒路徑,/data/data/com.xxx.xxx/
對(duì)應(yīng)的Android方法為 getFilesDir()
當(dāng)我們選擇SDCard時(shí)就表示存儲(chǔ)到SD卡上桦锄,: /storage/emulated/0/Android/data/com.example.myapplication/files

PC端:Application.dataPath 就是程序所在目錄扎附,PersistentDataPath是程序運(yùn)行數(shù)據(jù)所在目錄。

二结耀、各個(gè)路徑的特點(diǎn)

1留夜、Resources

是作為一個(gè)Unity的保留文件夾出現(xiàn)的,也就是如果你新建的文件夾的名字叫Resources图甜,那么里面的內(nèi)容在打包時(shí)都會(huì)被無(wú)條件的打到發(fā)布包中碍粥,其中資源的格式會(huì)經(jīng)過(guò)了unity的處理,算是unity的一種資源黑毅。
特點(diǎn):

  • 只讀嚼摩,即不能動(dòng)態(tài)修改。所以想要?jiǎng)討B(tài)更新的資源不要放在這里。
  • 會(huì)將文件夾內(nèi)的資源打包集成到.asset文件里面枕面。因此建議可以放一些Prefab愿卒,因?yàn)镻refab在打包時(shí)會(huì)自動(dòng)過(guò)濾掉不需要的資源,有利于減小資源包的大小潮秘。
  • 資源讀取使用Resources.Load()琼开。
  • 任何平臺(tái)都可以用File讀取
2、StreamingAssets

StreamingAssets和Resources很像枕荞。同樣作為一個(gè)只讀的Unity3D的保留文件夾出現(xiàn)柜候。不過(guò)兩者也有很大的區(qū)別,那就是Resources文件夾中的內(nèi)容在打包時(shí)會(huì)被壓縮和加密买猖。而StreamingAsset文件夾中的內(nèi)容則會(huì)原封不動(dòng)的打入包中改橘,因此StreamingAssets主要用來(lái)存放一些二進(jìn)制文件滋尉。這里原封不動(dòng)的意思玉控,是不經(jīng)過(guò)unity自身的處理,因此狮惜,比如把音視頻放這個(gè)文件夾高诺,想直接拖到場(chǎng)景中使用是拖不了的。在任何平臺(tái)中總可以統(tǒng)一使用Application.streamingAssetsPath 屬性來(lái)獲得這一文件夾路徑碾篡。
特點(diǎn):

  • PC端可讀寫虱而,移動(dòng)端只讀不可寫存谎。
  • 主要用來(lái)存放二進(jìn)制文件浮入,配置文件。
  • 注意孵运,在Android中穆律,StreamingAssets中的文件包含在一個(gè).jar壓縮文件(基本上與標(biāo)準(zhǔn)的zip為統(tǒng)一格式)中惠呼,所以移動(dòng)端時(shí)只能用過(guò)UnityWebRequest類來(lái)讀取。在PC下峦耘,可以用File類API(如File.ReadAllText)讀寫StreamingAssets文件夾中的文件剔蹋;在IOS和Android平臺(tái)下,不能用File類API讀取辅髓。
  • 任何平臺(tái)都可以用www方式異步讀取該文件夾內(nèi)容泣崩。PC和IOS平臺(tái)下,讀取路徑必須加上"file://"洛口,而安卓不需要矫付。
  • 在IOS和Android下,還能用AssetBundle.LoadFromFile來(lái)同步讀取數(shù)據(jù)第焰。
3买优、PersistentDataPath

這個(gè)路徑下是可讀寫。而且在IOS上就是應(yīng)用程序的沙盒,但是在Android可以是程序的沙盒而叼,也可以是sdcard身笤。并且在Android打包的時(shí)候,ProjectSetting頁(yè)面有一個(gè)選項(xiàng)Write Access葵陵,可以設(shè)置它的路徑是沙盒還是sdcard液荸。
特點(diǎn):
-可讀寫,不過(guò)只能運(yùn)行時(shí)才能寫入或者讀取脱篙。 提前將數(shù)據(jù)存入這個(gè)路徑是不可行的娇钱。

  • 無(wú)內(nèi)容限制。你可以從 StreamingAsset 中讀取二進(jìn)制文件或者從 AssetBundle 讀取文件來(lái)寫入 PersistentDataPath 中绊困。
  • 寫下的文件文搂,可以在電腦上查看。同樣也可以清掉秤朗。
  • 可以使用UnityWebRequest類來(lái)讀取煤蹭。
  • 可以用File類API(如File.ReadAllText)讀寫PersistentDataPath文件夾中的文件(安卓下唯一可以用File類的路徑)
4、Application.DataPath

注意移動(dòng)端是沒(méi)有訪問(wèn)權(quán)限的取视。在PC端和Editor模式時(shí)硝皂,可讀可寫。

三作谭、Unity文件的讀寫方式

  • 讀文件示例鏈接
  • 幾個(gè)文件操作類介紹
    1稽物、File類和FileInfo類的介紹:
    File類和FileInfo類都是提供用于創(chuàng)建、復(fù)制折欠、刪除贝或、移動(dòng)和打開(kāi)文件的方法,一個(gè)是靜態(tài)的锐秦,一個(gè)是實(shí)例方法咪奖。簡(jiǎn)單來(lái)說(shuō),就是Flie類可以直接通過(guò)類名調(diào)用其中的某些函數(shù)农猬,而FileInfo類需要先實(shí)例化一個(gè)對(duì)象赡艰,再通過(guò)對(duì)象調(diào)用函數(shù)。一般來(lái)說(shuō)斤葱,如果是對(duì)文件進(jìn)行少量的操作慷垮,則建議用File類,如果是對(duì)文件進(jìn)行大量的存取操作揍堕,建議用FileInfo類料身,具體原因參照這 。 這里是官方的文檔衩茸,F(xiàn)ile類芹血, FileInfo類。
    2、FileStream類和StreamWriter,StreamReader類的簡(jiǎn)單介紹:
    FileStream類是一個(gè)操作類幔烛,F(xiàn)ileStream 對(duì)象表示在磁盤或網(wǎng)絡(luò)路徑指向文件的流啃擦,這個(gè)類提供了在文件中讀寫字節(jié)的方法。簡(jiǎn)單來(lái)說(shuō)就是這個(gè)Filestream這個(gè)文件流對(duì) .txt等文件讀寫內(nèi)容時(shí)需要使用的一個(gè)工具饿悬。如果File類是一個(gè)總的文件的話令蛉,那么fileStream類就是對(duì)文件進(jìn)行操作的筆。 FileStream類和StreamWriter,StreamReader類的區(qū)別在于FileStream類操作的是字節(jié)和字節(jié)數(shù)組狡恬,而StreamWriter等類操作的是字符數(shù)據(jù)珠叔。StreamWriter類操作的只能是文本類型的,而FileStream類的對(duì)象可以是任何類型的弟劲。操作文本的話用StreamWriter等比較方便祷安。
    下面是用File和FileInfo兩種方式去創(chuàng)建文件,以及用StreamWriter寫文件的方法
    File方式
using UnityEngine;  
using System.Collections;  
using System.Collections.Generic;  
using System.IO;  
public class FileOperate : MonoBehaviour {  
    public void WriteFileByLine(string file_path,string file_name,string str_info)  
    {  
        StreamWriter sw;  
        if(!File.Exists(file_path+"http://"+file_name))  
        {  
            sw=File.CreateText(file_path+"http://"+file_name);//創(chuàng)建一個(gè)用于寫入 UTF-8 編碼的文本  
            Debug.Log("文件創(chuàng)建成功兔乞!");  
        }  
        else  
        {  
            sw=File.AppendText(file_path+"http://"+file_name);//打開(kāi)現(xiàn)有 UTF-8 編碼文本文件以進(jìn)行讀取  
        }  
        sw.WriteLine(str_info);//以行為單位寫入字符串  
        sw.Close ();  
        sw.Dispose ();//文件流釋放  
    }  
    void Start()  
    {  
        WriteFileByLine (Application.persistentDataPath,"my_newfile.txt","信息");  
    }  
}  

FileInfo方式

public void WriteFileByLine(string file_path,string file_name,string str_info)  
    {  
        StreamWriter sw;  
        FileInfo file_info = new FileInfo (file_path+"http://"+file_name);  
        if(!file_info.Exists)  
        {  
            sw=file_info.CreateText();//創(chuàng)建一個(gè)用于寫入 UTF-8 編碼的文本  
            Debug.Log("文件創(chuàng)建成功汇鞭!");  
        }  
        else  
        {  
            sw=file_info.AppendText();//打開(kāi)現(xiàn)有 UTF-8 編碼文本文件以進(jìn)行讀取  
        }  
        sw.WriteLine(str_info);  
        sw.Close ();  
        sw.Dispose ();//文件流釋放  
    }  

四、Unity路徑解疑

上面了解各個(gè)路徑的特性报嵌,讀寫方式虱咧,但是還有一個(gè)經(jīng)常容易犯錯(cuò)的地方熊榛,就是路徑的寫法锚国。
Unity3D關(guān)于路徑資源的調(diào)用分為絕對(duì)路徑和相對(duì)路徑,

  • 絕對(duì)路徑
    windows下:
    path = "file://D:\TestFile\Cat\" + Number + ".png";
    這種寫法玄坦,因?yàn)樾备苄枰D(zhuǎn)移血筑,所以這里是雙斜杠,不然報(bào)語(yǔ)法錯(cuò)誤煎楣,有些時(shí)候沒(méi)寫雙斜杠但又不報(bào)語(yǔ)法錯(cuò)豺总,但是路徑是錯(cuò)誤的,就很難發(fā)現(xiàn)問(wèn)題择懂。
    所以建議用另外一種寫法:
    @"file:///D:\TestFile\Cat" + Number + ".png";或者@"file://D:\TestFile\Cat" + Number + ".png";
    file后面跟三個(gè)斜杠或者兩個(gè)斜杠都行喻喳。
    安卓下:
    path ="jar:file://"+PersistentDataPath(示例)+ Number + ".png";
    注:因?yàn)樵诎沧肯聦?duì)unity來(lái)說(shuō)也只有PersistentDataPath,StreamingAssets這幾個(gè)路徑是可用的困曙,通常不會(huì)這么使用表伦,可以忽略,而且絕對(duì)路徑限制大慷丽,一般采用相對(duì)路徑蹦哼。
  • 相對(duì)路徑
    PC上:
    url = Application.persistentDataPath + "/mydir/qq.txt";
    或者
    string path= Path.Combine(Application.persistentDataPath, fillName);

安卓下:
"file://" + Application.streamingAssetsPath + "\TestFile\Cat\" + Number + ".png";
"file://" + Application.PersistentDataPath+ "\TestFile\Cat\" + Number + ".png";
或者"file://" + Path.Combine(Application.persistentDataPath, fillName);
總之,路徑寫法的東西要糊,不行就多是一兩次就好了纲熏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子局劲,更是在濱河造成了極大的恐慌勺拣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鱼填,死亡現(xiàn)場(chǎng)離奇詭異宣脉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剔氏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門塑猖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谈跛,你說(shuō)我怎么就攤上這事羊苟。” “怎么了感憾?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蜡励,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我阻桅,道長(zhǎng)凉倚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任嫂沉,我火速辦了婚禮稽寒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟章。我一直安慰自己杏糙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布蚓土。 她就那樣靜靜地躺著宏侍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜀漆。 梳的紋絲不亂的頭發(fā)上谅河,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音确丢,去河邊找鬼绷耍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蠕嫁,可吹牛的內(nèi)容都是我干的锨天。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剃毒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼病袄!你這毒婦竟也來(lái)了搂赋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤益缠,失蹤者是張志新(化名)和其女友劉穎脑奠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幅慌,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宋欺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胰伍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齿诞。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骂租,靈堂內(nèi)的尸體忽然破棺而出祷杈,到底是詐尸還是另有隱情,我是刑警寧澤渗饮,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布但汞,位于F島的核電站,受9級(jí)特大地震影響互站,放射性物質(zhì)發(fā)生泄漏私蕾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一胡桃、第九天 我趴在偏房一處隱蔽的房頂上張望踩叭。 院中可真熱鬧,春花似錦标捺、人聲如沸懊纳。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冤今,卻和暖如春闺兢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戏罢。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工屋谭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人龟糕。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓桐磁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親讲岁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子我擂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354