Unity数据存储路径总结

 

一.在项目根目录中创建Resources文件夹来保存文件。
可以使用Resources.Load("文件名字,注:不包括文件后缀名");把文件夹中的对象加载出来。
注:此方可实现对文件实施“增删查改”等操作,但打包后不可以更改了

二.直接放在项目根路径下来保存文件
在直接使用Application.dataPath来读取文件进行操作。
注:移动端是没有访问权限的。

三.在项目根目录中创建StreamingAssets文件夹来保存文件
1.可使用Application.dataPath来读取文件进行操作。
2.直接使用Application.streamingAssetsPath来读取文件进行操作。
注:此方法在pc/Mac电脑中可实现对文件实施“增删查改”等操作,但在移动端只支持读取操作。


四.使用Application.persistentDataPath来操作文件(荐)
该文件存在手机沙盒中,因为不能直接存放文件,
1.通过服务器直接下载保存到该位置,也可以通过Md5码比对下载更新新的资源
2.没有服务器的,只有间接通过文件流的方式从本地读取并写入Application.persistentDataPath文件下,然后再通过Application.persistentDataPath来读取操作。
注:在Pc/Mac电脑 以及android跟Ipad、ipone都可对文件进行任意操作,另外在IOS上该目录下的东西可以被iCloud自动备份。

五.使用Application.temporaryCachePath来操作文件

操作方式跟上面Application.persistentDataPath类似。除了在IOS上不能被iCloud自动备份。

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


android:
Application.dataPath : /data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath : jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
Application.persistentDataPath : /data/data/xxx.xxx.xxx/files
Application.temporaryCachePath : /data/data/xxx.xxx.xxx/cache


Windows Web Player:
Application.dataPath : file:///D:/MyGame/WebPlayer (即导包后保存的文件夹,html文件所在文件夹)
Application.streamingAssetsPath :
Application.persistentDataPath :
Application.temporaryCachePath : 


注意:
Application.persistentDataPath 才是移动端可用的保存生成文件的地方
放到resource中打包后不可以更改了
放到Application .dataPath中移动端是没有访问权限的

===================================================
如何查看iPhone文件存放目录?首先需要越狱,越狱后打开iPhone手机目录,找到/Applications目录下就是iPhone所有软件目录。


iPhone文件目录介绍


1、/Applications


常用软件的安装目录。


2. /private ar/ mobile/Media /iphone video Recorder


iphone video Recorder录像文件存放目录。


3. /private ar/ mobile/Media /DCIM


相机拍摄的照片文件存放目录。


4、/privatear/ mobile /Media/iTunes_Control/Music


iTunes上传的多媒体文件(例如MP3、MP4等)存放目录,文件没有被修改,但是文件名字被修改了,直接下载到电脑即可读取。


5、/private ar/root/Media/EBooks


熊猫看书存放目录。


6、/Library/Ringtones


系统自带的来电铃声存放目录。


7、/System/Library/Audio/UISounds


短信记其它系统默认效果铃声(m4r铃声文件改扩展名为.caf)短信铃声文件名为sms-received开头的caf文件。


8、/privatear/ mobile /Library/AddressBook


系统电话本的存放目录。


/privatear/mobile/Library/SMS


短信存放目录


9、/private ar/ mobile/Media /iphone Recorder


iPhone Recorder录音软件文件存放目录


10、/Applications/Preferences.app/zh_CN.lproj


软件Preferences.app的中文汉化文件存放目录


11、/Library/Wallpaper


系统q1ang纸的存放目录


12、/System/Library/Audio/UISounds


系统声音文件的存放目录


13、/privatear/root/Media/PXL


ibrickr上传安装程序建立的一个数据库,估计和windows的uninstall记录差不多。


14、/bin


和linux系统差不多,是系统执行指令的存放目录。


15、/privatear/ mobile /Library/SMS


系统短信的存放目录


16、/privatear/run


系统进程运行的临时目录?(查看这里可以看到系统启动的所有进程)


17、/privatear/logs/CrashReporter


系统错误记录报。 
若有不足欢迎指正!!!

 

 

 

一.在项目根目录中创建Resources文件夹来保存文件。
可以使用Resources.Load("文件名字,注:不包括文件后缀名");把文件夹中的对象加载出来
注:此方可实现对文件实施“增删查改”等操作,但打包后不可以更改了

二.直接放在项目根路径下来保存文件
在直接使用Application.dataPath来读取文件进行操作。
注:移动端是没有访问权限的。

三.在项目根目录中创建StreamingAssets文件夹来保存文件
1.可使用Application.dataPath来读取文件进行操作。

[C#] 纯文本查看 复制代码
1
2
3
4
5
6
7
#if UNITY_EDITOR
string filepath = Application.dataPath +"/StreamingAssets"+"/my.xml";
#elif UNITY_IPHONE
 string filepath = Application.dataPath +"/Raw"+"/my.xml";
#elif UNITY_android
 string filepath = "jar:file://" + Application.dataPath + "!/assets/"+"/my.xml;
#endif


2.直接使用Application.streamingAssetsPath来读取文件进行操作。
注:此方法在pc/Mac电脑中可实现对文件实施“增删查改”等操作,但在移动端只支持读取操作。

四.使用Application.persistentDataPath来操作文件(
该文件存在手机沙盒中,因为不能直接存放文件,
1.通过服务器直接下载保存到该位置,也可以通过Md5码比对下载更新新的资源
2.没有服务器的,只有间接通过文件流的方式从本地读取并写入Application.persistentDataPath文件下,然后再通过Application.persistentDataPath来读取操作。
注:在Pc/Mac电脑 以及Android跟Ipad、ipone都可对文件进行任意操作,另外在IOS上该目录下的东西可以被iCloud自动备份

五.使用Application.temporaryCachePath来操作文件

操作方式跟上面Application.persistentDataPath类似。除了在IOS上不能被iCloud自动备份。

下图是几种文件在Pc中路径的具体位置
<ignore_js_op> 

其实,在前面我已经发过一篇《Unity中的Path对应各平台中的Path》的文章,大家可以看看,详细了解下unity在移动平台中的可操作的具体路径。
有直接给出各平台对应路径哟,方便调试查看。
好了,unity路径的使用以及注意点都总结了,现在还是送点干料给大家吧,里面都有详细注释,都是开发中常用的东西

本帖隐藏的内容

1.对文件的操作类,主要就是文流读取操作的一些东西(包括Assetbundle)
FileHelper.cs
[C#] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
<br>
using UnityEngine;<br>
using System.Collections;<br>
using System.IO;<br>
using System.Collections.Generic;<br>
using System;<br>
/// <summary><br>
/// 使用Application.persistentDataPath方式来创建文件,读写Xml文件.<br>
/// 注Application.persistentDataPath末尾没有“/”符号<br>
/// </summary><br>
public class FileHelper: MonoBehaviour<br>
{<br>
/// <summary><br>
/// 动态创建文件夹.<br>
/// </summary><br>
/// <returns>The folder.</returns><br>
/// <param name="path">文件创建目录.</param><br>
/// <param name="FolderName">文件夹名(不带符号).</param><br>
public string CreateFolder(string path,string FolderName)<br>
{<br>
string FolderPath = path+FolderName;<br>
if(!Directory.Exists(FolderPath))<br>
{ <br>
Directory.CreateDirectory(FolderPath);<br>
} <br>
return FolderPath;<br>
}<br>
<br>
/// <summary><br>
/// 创建文件.<br>
/// </summary><br>
/// <param name="path">完整文件夹路径.</param><br>
/// <param name="name">文件的名称.</param><br>
/// <param name="info">写入的内容.</param><br>
public void CreateFile(string path,string name,string info)<br>
{<br>
//文件流信息<br>
StreamWriter sw;<br>
FileInfo t = new FileInfo(path+name);<br>
if(!t.Exists)<br>
{<br>
//如果此文件不存在则创建<br>
sw = t.CreateText();<br>
}<br>
else<br>
{<br>
//如果此文件存在则打开<br>
sw = t.AppendText();<br>
}<br>
//以行的形式写入信息<br>
sw.WriteLine(info);<br>
//关闭流<br>
sw.Close();<br>
//销毁流<br>
sw.Dispose();<br>
} <br>
<br>
/// <summary><br>
/// 读取文件.<br>
/// </summary><br>
/// <returns>The file.</returns><br>
/// <param name="path">完整文件夹路径.</param><br>
/// <param name="name">读取文件的名称.</param><br>
public ArrayList LoadFile(string path,string name)<br>
{<br>
//使用流的形式读取<br>
StreamReader sr =null;<br>
try{<br>
sr = File.OpenText(path+name);<br>
}catch(Exception e)<br>
{<br>
//路径与名称未找到文件则直接返回空<br>
return null;<br>
}<br>
string line;<br>
ArrayList arrlist = new ArrayList();<br>
while ((line = sr.ReadLine()) != null)<br>
{<br>
//一行一行的读取<br>
//将每一行的内容存入数组链表容器中<br>
arrlist.Add(line);<br>
}<br>
//关闭流<br>
sr.Close();<br>
//销毁流<br>
sr.Dispose();<br>
//将数组链表容器返回<br>
return arrlist;<br>
} <br>
//写入模型到本地<br>
IEnumerator loadassetbundle(string url)<br>
{<br>
WWW w = new WWW(url);<br>
yield return w;<br>
if (w.isDone)<br>
{<br>
byte[] model = w.bytes;<br>
int length = model.Length;<br>
//写入模型到本地<br>
CreateassetbundleFile(Application.persistentDataPath, "Model.assetbundle", model,length);<br>
}<br>
}<br>
/// <summary><br>
/// 获取文件下所有文件大小<br>
/// </summary><br>
/// <param name="filePath"></param><br>
/// <returns></returns><br>
public int GetAllFileSize(string filePath)<br>
{<br>
int sum = 0;<br>
if (!Directory.Exists(filePath))<br>
{<br>
return 0;<br>
}<br>
<br>
DirectoryInfo dti = new DirectoryInfo(filePath);<br>
<br>
FileInfo[] fi = dti.GetFiles();<br>
<br>
foreach (FileInfo f in fi)<br>
{<br>
<br>
sum += Convert.ToInt32(f.Length / 1024);<br>
}<br>
<br>
DirectoryInfo[] di = dti.GetDirectories();<br>
<br>
if (di.Length > 0)<br>
{<br>
for (int i = 0; i < di.Length; i++)<br>
{<br>
sum += GetAllFileSize(di<em>.FullName);<br>
}<br>
}<br>
return sum;<br>
}<br>
/// <summary><br>
/// 获取指定文件大小<br>
/// </summary><br>
/// <param name="FilePath"></param><br>
/// <param name="FileName"></param><br>
/// <returns></returns><br>
public int GetFileSize(string FilePath, string FileName)<br>
{<br>
int sum = 0;<br>
if (!Directory.Exists(FilePath))<br>
{<br>
return 0;<br>
}<br>
else<br>
{<br>
FileInfo Files = new FileInfo(@FilePath + FileName);<br>
sum += Convert.ToInt32(Files.Length / 1024);<br>
}<br>
return sum;<br>
}<br>
void CreateassetbundleFile(string path, string name, byte[] info, int length)<br>
{<br>
//文件流信息<br>
//StreamWriter sw;<br>
Stream sw;<br>
FileInfo t = new FileInfo(path + "//" + name);<br>
if (!t.Exists)<br>
{<br>
//如果此文件不存在则创建<br>
sw = t.Create();<br>
}<br>
else<br>
{<br>
//如果此文件存在则打开<br>
//sw = t.Append();<br>
return;<br>
}<br>
//以行的形式写入信息<br>
sw.Write(info, 0, length);<br>
//关闭流<br>
sw.Close();<br>
//销毁流<br>
sw.Dispose();<br>
}<br>
//读取本地AssetBundle文件<br>
IEnumerator LoadAssetbundleFromLocal(string path, string name)<br>
{<br>
print("file:///" + path + "/" + name);<br>
<br>
WWW w = new WWW("file:///"+path + "/" + name);<br>
<br>
yield return w;<br>
<br>
if (w.isDone)<br>
<br>
{<br>
Instantiate(w.assetBundle.mainAsset);<br>
}<br>
}<br>
<br>
/// <summary><br>
/// 删除文件.<br>
/// </summary><br>
/// <param name="path">删除完整文件夹路径.</param><br>
/// <param name="name">删除文件的名称.</param><br>
public void DeleteFile(string path, string name)<br>
{<br>
File.Delete(path + name);<br>
}<br>
/// <summary><br>
/// 删除文件<br>
/// </summary><br>
/// <param name="path"></param><br>
/// <param name="filesName"></param><br>
/// <returns></returns><br>
public bool DeleteFiles(string path, string filesName)<br>
{<br>
bool isDelete = false;<br>
try<br>
{<br>
if (Directory.Exists(path))<br>
{<br>
if (File.Exists(path + "\\" + filesName))<br>
{<br>
File.Delete(path + "\\" + filesName);<br>
isDelete = true;<br>
}<br>
}<br>
}<br>
catch<br>
{<br>
return isDelete;<br>
}<br>
return isDelete;<br>
}<br>
}<br>
</em>


2.随机操作类
RandomHelper.cs
[C#] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<br>
using UnityEngine;<br>
using System.Collections;<br>
/// <summary><br>
/// 随机操作类<br>
/// </summary><br>
public class RandomHelper <br>
{<br>
private static char[] constant = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };<br>
/// <summary><br>
/// 字符串随机<br>
/// </summary><br>
/// <param name="Length">要随机的位数</param><br>
/// <returns></returns><br>
public string GenerateRandomNumber(int Length)<br>
{<br>
System.Text.StringBuilder newRandom = new System.Text.StringBuilder(62);<br>
for (int i = 0; i < Length; i++)<br>
{<br>
newRandom.Append(constant[Random.Range(0,62)]);<br>
}<br>
return newRandom.ToString();<br>
}<br>
private static char[] constant1 = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };<br>
/// <summary><br>
/// 数字随机<br>
/// </summary><br>
/// <param name="Length">要随机的位数</param><br>
/// <returns></returns><br>
public string GenerateNumber(int Length)<br>
{<br>
System.Text.StringBuilder newRandom = new System.Text.StringBuilder(10);<br>
for (int i = 0; i < Length; i++)<br>
{<br>
newRandom.Append(constant1[Random.Range(0, 10)]);<br>
}<br>
return newRandom.ToString();<br>
}<br>
/// <summary><br>
/// 字符串数组随机<br>
/// </summary><br>
/// <param name="chars">数组</param><br>
/// <param name="Length">随机的位数</param><br>
/// <returns></returns><br>
public string GetStrRandomSurname(string[] chars, int Length)<br>
{<br>
int count = chars.Length;<br>
System.Text.StringBuilder newRandom = new System.Text.StringBuilder(count);<br>
<br>
for (int i = 0; i < Length; i++)<br>
{<br>
newRandom.Append(chars[Random.Range(0, count)]);<br>
}<br>
return newRandom.ToString();<br>
}<br>
/// <summary><br>
/// 字符串*截取<br>
/// </summary><br>
/// <param name="str">字符串</param><br>
/// <returns></returns><br>
public string[] getStringToList(string str)<br>
{<br>
return str.Split('*');<br>
}<br>
}

 

posted @   zhepama  阅读(10355)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示