[Unity基础]移动平台下的文件读写

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33337811/article/details/53765631

参考自:http://blog.csdn.net/lyh916/article/details/52161633


在移动平台中,一般读取资源会通过下面这三个路径:

1.Resources :

2.Application.streamingAssetsPath(只读)

3.Application.persistentDataPath(同时这个也是可写的):


几个特殊文件夹:

1.Application.streamingAssetsPath(只读)  :  

需要手动建一个StreamingAssets文件夹。在打包时,Resources文件夹下的东西会被压缩和加密。而StreamingAssets文件夹中的内容则会原封不动的打入包中。

一般在Resources下放预制,StreamingAssets下放二进制文件(csv、bin、txt、xml、json、AB包等)

返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径,工程目录下面的Assets/StreamingAssets。


安卓不能通过File类和FileStream来读取这个路径,只能通过WWW类获取然后用File写到持久化目录。这是因为在Android中,StreamingAssets的东西会被包含在.jar包中(类似于zip压缩文件);IOS和QP8可以用File.Copy。

 

2.Application.persistentDataPath(可读可写) :File.WriteAllText,File.ReadAllText

安卓只有这个文件夹可以用File类来读写;

返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件。移动端可用的保存生成文件的地方。
设备中的公开目录,根据平台的不同而不同。这里面的文件不会因为App升级而删除。


3.Application.dataPath(只读):返回程序的数据文件所在文件夹的路径


4.Application.temporaryCachePath(只读):返回一个临时数据的缓存目录。


移动端的特殊文件夹:
Android:
Application.dataPath                                  /data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath           jar:file://  Application.dataPath !/assets
Application.persistentDataPath                /data/data/xxx.xxx.xxx/files
Application.temporaryCachePath            /data/data/xxx.xxx.xxx/cache

iOS:

Application.dataPath                                   Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPath            Application.dataPath/Raw
Application.persistentDataPath               Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePath            Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches

测试

游戏开始把StreamingAssets文件复制到持久化目录:

#if UNITY_EDITOR
            var dbPath = string.Format(@"Assets/StreamingAssets/{0}", DatabaseName);
#else
        // 检测文件在持久化目录下是否存在
        var filepath = string.Format("{0}/{1}", Application.persistentDataPath, DatabaseName);

        if (!File.Exists(filepath))
        {
            // 不存在则从StreamingAssets中读取写到持久化目录中
#if UNITY_ANDROID 
            var loadDb = new WWW("jar:file://" + Application.dataPath + "!/assets/" + DatabaseName);  // 安卓下streamingAssets目录
            while (!loadDb.isDone) { }  
            // 写到持久化目录
            File.WriteAllBytes(filepath, loadDb.bytes);
#elif UNITY_IOS
                 var loadDb = Application.dataPath + "/Raw/" + DatabaseName;  //IOS下StreamingAssets目录
                //保存到持久化目录
                File.Copy(loadDb, filepath);
#elif UNITY_WP8
                var loadDb = Application.dataPath + "/StreamingAssets/" + DatabaseName;  
                File.Copy(loadDb, filepath);

#elif UNITY_WINRT
		var loadDb = Application.dataPath + "/StreamingAssets/" + DatabaseName; 
		File.Copy(loadDb, filepath);
#else
	var loadDb = Application.dataPath + "/StreamingAssets/" + DatabaseName;
	File.Copy(loadDb, filepath);

#endif

引用http://blog.csdn.net/lyh916/article/details/52161633的案例:

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.IO;  
  4. using UnityEngine.UI;  
  5. using System.Text;  
  6.   
  7. public class Test : MonoBehaviour {  
  8.   
  9.     public Text text0;  
  10.     public Text text1;  
  11.     public Text text2;  
  12.     public Text text3;  
  13.     private string path;  
  14.     private string content;  
  15.   
  16.     void Start ()   
  17.     {  
  18.         //显示不同平台下的路径信息  
  19.         text0.text = Application.dataPath + "\n" + Application.streamingAssetsPath + "\n" + Application.persistentDataPath;  
  20.   
  21.         //读取StreamingAssets下的文件  
  22.         if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer)  
  23.         {  
  24.             path = "file://" + Application.streamingAssetsPath + "/Data/AA.bin";  
  25.         }  
  26.         else if (Application.platform == RuntimePlatform.Android)  
  27.         {  
  28.             path = Application.streamingAssetsPath + "/Data/AA.bin";  
  29.         }     
  30.         StartCoroutine(Load(path, (s) => { content += Application.platform + "\n" + s + "\n"; }));  
  31.   
  32.         //读取Resources下的文件  
  33.         text2.text = Resources.Load<TextAsset>("CC").text;  
  34.   
  35.         //读取与写入Application.persistentDataPath下的文件  
  36.         path = Application.persistentDataPath + "/BB.txt";  
  37.         File.WriteAllText(path, "保佑这个也能读取成功啊~~hello??", Encoding.UTF8);  
  38.         text3.text = File.ReadAllText(path, Encoding.UTF8);  
  39.     }  
  40.   
  41.     IEnumerator Load(string url, System.Action<string> action)  
  42.     {  
  43.         WWW www = new WWW(url);  
  44.         yield return www;  
  45.         //Debug.Log(www.text);  
  46.         action(www.text);  
  47.     }  
  48.   
  49. }  




展开阅读全文

没有更多推荐了,返回首页