一、文件与路径——2、unity路径特点写法和文件读写全攻略

一、Unity中各路径和目录的对应关系

image.png

其中,安卓中的路径是有两种分支的


image.png

在打包面板中,有个Write Access
当我们选择Internal Only就是表示沙盒路径,/data/data/com.xxx.xxx/
对应的Android方法为 getFilesDir()
当我们选择SDCard时就表示存储到SD卡上,: /storage/emulated/0/Android/data/com.example.myapplication/files

PC端:Application.dataPath 就是程序所在目录,PersistentDataPath是程序运行数据所在目录。

二、各个路径的特点

1、Resources

是作为一个Unity的保留文件夹出现的,也就是如果你新建的文件夹的名字叫Resources,那么里面的内容在打包时都会被无条件的打到发布包中,其中资源的格式会经过了unity的处理,算是unity的一种资源。
特点:

  • 只读,即不能动态修改。所以想要动态更新的资源不要放在这里。
  • 会将文件夹内的资源打包集成到.asset文件里面。因此建议可以放一些Prefab,因为Prefab在打包时会自动过滤掉不需要的资源,有利于减小资源包的大小。
  • 资源读取使用Resources.Load()。
  • 任何平台都可以用File读取
2、StreamingAssets

StreamingAssets和Resources很像。同样作为一个只读的Unity3D的保留文件夹出现。不过两者也有很大的区别,那就是Resources文件夹中的内容在打包时会被压缩和加密。而StreamingAsset文件夹中的内容则会原封不动的打入包中,因此StreamingAssets主要用来存放一些二进制文件。这里原封不动的意思,是不经过unity自身的处理,因此,比如把音视频放这个文件夹,想直接拖到场景中使用是拖不了的。在任何平台中总可以统一使用Application.streamingAssetsPath 属性来获得这一文件夹路径。
特点:

  • PC端可读写,移动端只读不可写。
  • 主要用来存放二进制文件,配置文件。
  • 注意,在Android中,StreamingAssets中的文件包含在一个.jar压缩文件(基本上与标准的zip为统一格式)中,所以移动端时只能用过UnityWebRequest类来读取。在PC下,可以用File类API(如File.ReadAllText)读写StreamingAssets文件夹中的文件;在IOS和Android平台下,不能用File类API读取。
  • 任何平台都可以用www方式异步读取该文件夹内容。PC和IOS平台下,读取路径必须加上"file://",而安卓不需要。
  • 在IOS和Android下,还能用AssetBundle.LoadFromFile来同步读取数据。
3、PersistentDataPath

这个路径下是可读写。而且在IOS上就是应用程序的沙盒,但是在Android可以是程序的沙盒,也可以是sdcard。并且在Android打包的时候,ProjectSetting页面有一个选项Write Access,可以设置它的路径是沙盒还是sdcard。
特点:
-可读写,不过只能运行时才能写入或者读取。 提前将数据存入这个路径是不可行的。

  • 无内容限制。你可以从 StreamingAsset 中读取二进制文件或者从 AssetBundle 读取文件来写入 PersistentDataPath 中。
  • 写下的文件,可以在电脑上查看。同样也可以清掉。
  • 可以使用UnityWebRequest类来读取。
  • 可以用File类API(如File.ReadAllText)读写PersistentDataPath文件夹中的文件(安卓下唯一可以用File类的路径)
4、Application.DataPath

注意移动端是没有访问权限的。在PC端和Editor模式时,可读可写。

三、Unity文件的读写方式

  • 读文件示例链接
  • 几个文件操作类介绍
    1、File类和FileInfo类的介绍:
    File类和FileInfo类都是提供用于创建、复制、删除、移动和打开文件的方法,一个是静态的,一个是实例方法。简单来说,就是Flie类可以直接通过类名调用其中的某些函数,而FileInfo类需要先实例化一个对象,再通过对象调用函数。一般来说,如果是对文件进行少量的操作,则建议用File类,如果是对文件进行大量的存取操作,建议用FileInfo类,具体原因参照这 。 这里是官方的文档,File类, FileInfo类。
    2、FileStream类和StreamWriter,StreamReader类的简单介绍:
    FileStream类是一个操作类,FileStream 对象表示在磁盘或网络路径指向文件的流,这个类提供了在文件中读写字节的方法。简单来说就是这个Filestream这个文件流对 .txt等文件读写内容时需要使用的一个工具。如果File类是一个总的文件的话,那么fileStream类就是对文件进行操作的笔。 FileStream类和StreamWriter,StreamReader类的区别在于FileStream类操作的是字节和字节数组,而StreamWriter等类操作的是字符数据。StreamWriter类操作的只能是文本类型的,而FileStream类的对象可以是任何类型的。操作文本的话用StreamWriter等比较方便。
    下面是用File和FileInfo两种方式去创建文件,以及用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+"//"+file_name))  
        {  
            sw=File.CreateText(file_path+"//"+file_name);//创建一个用于写入 UTF-8 编码的文本  
            Debug.Log("文件创建成功!");  
        }  
        else  
        {  
            sw=File.AppendText(file_path+"//"+file_name);//打开现有 UTF-8 编码文本文件以进行读取  
        }  
        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+"//"+file_name);  
        if(!file_info.Exists)  
        {  
            sw=file_info.CreateText();//创建一个用于写入 UTF-8 编码的文本  
            Debug.Log("文件创建成功!");  
        }  
        else  
        {  
            sw=file_info.AppendText();//打开现有 UTF-8 编码文本文件以进行读取  
        }  
        sw.WriteLine(str_info);  
        sw.Close ();  
        sw.Dispose ();//文件流释放  
    }  

四、Unity路径解疑

上面了解各个路径的特性,读写方式,但是还有一个经常容易犯错的地方,就是路径的写法。
Unity3D关于路径资源的调用分为绝对路径和相对路径,

  • 绝对路径
    windows下:
    path = "file://D:\TestFile\Cat\" + Number + ".png";
    这种写法,因为斜杠需要转移,所以这里是双斜杠,不然报语法错误,有些时候没写双斜杠但又不报语法错,但是路径是错误的,就很难发现问题。
    所以建议用另外一种写法:
    @"file:///D:\TestFile\Cat" + Number + ".png";或者@"file://D:\TestFile\Cat" + Number + ".png";
    file后面跟三个斜杠或者两个斜杠都行。
    安卓下:
    path ="jar:file://"+PersistentDataPath(示例)+ Number + ".png";
    注:因为在安卓下对unity来说也只有PersistentDataPath,StreamingAssets这几个路径是可用的,通常不会这么使用,可以忽略,而且绝对路径限制大,一般采用相对路径。
  • 相对路径
    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);
总之,路径写法的东西,不行就多是一两次就好了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335