您的位置:首页 > 移动开发 > Unity3D

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

2016-12-20 17:08 211 查看
参考自: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

 





using UnityEngine;  

using System.Collections;  

using System.IO;  

using UnityEngine.UI;  

using System.Text;  

  

public class Test : MonoBehaviour {  

  

    public Text text0;  

    public Text text1;  

    public Text text2;  

    public Text text3;  

    private string path;  

    private string content;  

  

    void Start ()   

    {  

        //显示不同平台下的路径信息  

        text0.text = Application.dataPath + "\n" + Application.streamingAssetsPath + "\n" + Application.persistentDataPath;  

  

        //读取StreamingAssets下的文件  

        if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer)  

        {  

            path = "file://" + Application.streamingAssetsPath + "/Data/AA.bin";  

        }  

        else if (Application.platform == RuntimePlatform.Android)  

        {  

            path = Application.streamingAssetsPath + "/Data/AA.bin";  

        }     

        StartCoroutine(Load(path, (s) => { content += Application.platform + "\n" + s + "\n"; }));  

  

        //读取Resources下的文件  

        text2.text = Resources.Load<TextAsset>("CC").text;  

  

        //读取与写入Application.persistentDataPath下的文件  

        path = Application.persistentDataPath + "/BB.txt";  

        File.WriteAllText(path, "保佑这个也能读取成功啊~~hello??", Encoding.UTF8);  

        text3.text = File.ReadAllText(path, Encoding.UTF8);  

    }  

  

    IEnumerator Load(string url, System.Action<string> action)  

    {  

        WWW www = new WWW(url);  

        yield return www;  

        //Debug.Log(www.text);  

        action(www.text);  

    }  

  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: