(转) unity 在移动平台中,文件操作路径详解

http://www.unitymanual.com/thread-23491-1-1.html

今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够更好、更快的掌握,当然,如有不足的地方 欢迎指正!!!

相信大家在开发过程中,难免会保存一些文件在客户端进行本地化操作。
如:配置文件,状态文件,Assetbundle文件等等...

最近总有人问我:
1.保存了一个xml在客户端,能读取里面的数据,可是不能修改,甚至一修改就报错...
2.我在电脑上操作文件(xml、text、Assetbundle、json)都没问题,可是生成打包生成apk、ipa运行就出现各种问题,
要么数据读不到,要么数据不能操作...

这些问题的病症到底出现在什么地方?又该如何解决?
其实,就是对文件保存的路径在平台间的适用性,有些路径在各个平台上是不能通用的。
在此我对unity中路径操作做以下几种总结:
一.在项目根目录中创建Resources文件夹来保存文件。
可以使用Resources.Load("文件名字,注:不包括文件后缀名");把文件夹中的对象加载出来。
注:此方可实现对文件实施“增删查改”等操作,但打包后不可以更改了。

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

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

[C#] 纯文本查看 复制代码

?


1

2

3

4

5

6

7

8

9

[/color][/font]

[font=微软雅黑][color=#9acd32]#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[/color][/font]

[font=微软雅黑][color=#9acd32]

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#] 纯文本查看 复制代码

?


001

002

003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

022

023

024

025

026

027

028

029

030

031

032

033

034

035

036

037

038

039

040

041

042

043

044

045

046

047

048

049

050

051

052

053

054

055

056

057

058

059

060

061

062

063

064

065

066

067

068

069

070

071

072

073

074

075

076

077

078

079

080

081

082

083

084

085

086

087

088

089

090

091

092

093

094

095

096

097

098

099

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

using UnityEngine;

using System.Collections;

using System.IO;

using System.Collections.Generic;

using System;

/// <summary>

/// 使用Application.persistentDataPath方式来创建文件,读写Xml文件.

/// 注Application.persistentDataPath末尾没有“/”符号

/// </summary>

public class FileHelper: MonoBehaviour

{

/// <summary>

/// 动态创建文件夹.

/// </summary>

/// <returns>The folder.</returns>

/// <param name="path">文件创建目录.</param>

/// <param name="FolderName">文件夹名(不带符号).</param>

public string CreateFolder(string path,string FolderName)

{

string FolderPath = path+FolderName;

if(!Directory.Exists(FolderPath))

{

Directory.CreateDirectory(FolderPath);

}

return FolderPath;

}

/// <summary>

/// 创建文件.

/// </summary>

/// <param name="path">完整文件夹路径.</param>

/// <param name="name">文件的名称.</param>

/// <param name="info">写入的内容.</param>

public void CreateFile(string path,string name,string info)

{

//文件流信息

StreamWriter sw;

FileInfo t = new FileInfo(path+name);

if(!t.Exists)

{

//如果此文件不存在则创建

sw = t.CreateText();

}

else

{

//如果此文件存在则打开

sw = t.AppendText();

}

//以行的形式写入信息

sw.WriteLine(info);

//关闭流

sw.Close();

//销毁流

sw.Dispose();

}

/// <summary>

/// 读取文件.

/// </summary>

/// <returns>The file.</returns>

/// <param name="path">完整文件夹路径.</param>

/// <param name="name">读取文件的名称.</param>

public ArrayList LoadFile(string path,string name)

{

//使用流的形式读取

StreamReader sr =null;

try{

sr = File.OpenText(path+name);

}catch(Exception e)

{

//路径与名称未找到文件则直接返回空

return null;

}

string line;

ArrayList arrlist = new ArrayList();

while ((line = sr.ReadLine()) != null)

{

//一行一行的读取

//将每一行的内容存入数组链表容器中

arrlist.Add(line);

}

//关闭流

sr.Close();

//销毁流

sr.Dispose();

//将数组链表容器返回

return arrlist;

}

//写入模型到本地

IEnumerator loadassetbundle(string url)

{

WWW w = new WWW(url);

yield return w;

if (w.isDone)

{

byte[] model = w.bytes;

int length = model.Length;

//写入模型到本地

CreateassetbundleFile(Application.persistentDataPath, "Model.assetbundle", model,length);

}

}

/// <summary>

/// 获取文件下所有文件大小

/// </summary>

/// <param name="filePath"></param>

/// <returns></returns>

public int GetAllFileSize(string filePath)

{

int sum = 0;

if (!Directory.Exists(filePath))

{

return 0;

}

DirectoryInfo dti = new DirectoryInfo(filePath);

FileInfo[] fi = dti.GetFiles();

foreach (FileInfo f in fi)

{

sum += Convert.ToInt32(f.Length / 1024);

}

DirectoryInfo[] di = dti.GetDirectories();

if (di.Length > 0)

{

for (int i = 0; i < di.Length; i++)

{

sum += GetAllFileSize(di[i].FullName);

}

}

return sum;

}

/// <summary>

/// 获取指定文件大小

/// </summary>

/// <param name="FilePath"></param>

/// <param name="FileName"></param>

/// <returns></returns>

public int GetFileSize(string FilePath, string FileName)

{

int sum = 0;

if (!Directory.Exists(FilePath))

{

return 0;

}

else

{

FileInfo Files = new FileInfo(@FilePath + FileName);

sum += Convert.ToInt32(Files.Length / 1024);

}

return sum;

}

void CreateassetbundleFile(string path, string name, byte[] info, int length)

{

//文件流信息

//StreamWriter sw;

Stream sw;

FileInfo t = new FileInfo(path + "//" + name);

if (!t.Exists)

{

//如果此文件不存在则创建

sw = t.Create();

}

else

{

//如果此文件存在则打开

//sw = t.Append();

return;

}

//以行的形式写入信息

sw.Write(info, 0, length);

//关闭流

sw.Close();

//销毁流

sw.Dispose();

}

//读取本地AssetBundle文件

IEnumerator LoadAssetbundleFromLocal(string path, string name)

{

print("file:///" + path + "/" + name);

WWW w = new WWW("file:///"+path + "/" + name);

yield return w;

if (w.isDone)

{

Instantiate(w.assetBundle.mainAsset);

}

}

/// <summary>

/// 删除文件.

/// </summary>

/// <param name="path">删除完整文件夹路径.</param>

/// <param name="name">删除文件的名称.</param>

public void DeleteFile(string path, string name)

{

File.Delete(path + name);

}

/// <summary>

/// 删除文件

/// </summary>

/// <param name="path"></param>

/// <param name="filesName"></param>

/// <returns></returns>

public bool DeleteFiles(string path, string filesName)

{

bool isDelete = false;

try

{

if (Directory.Exists(path))

{

if (File.Exists(path + "\\" + filesName))

{

File.Delete(path + "\\" + filesName);

isDelete = true;

}

}

}

catch

{

return isDelete;

}

return isDelete;

}

}

2.随机操作类
RandomHelper.cs

[C#] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

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

using UnityEngine;

using System.Collections;

/// <summary>

/// 随机操作类

/// </summary>

public class RandomHelper

{

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‘ };

/// <summary>

/// 字符串随机

/// </summary>

/// <param name="Length">要随机的位数</param>

/// <returns></returns>

public string GenerateRandomNumber(int Length)

{

System.Text.StringBuilder newRandom = new System.Text.StringBuilder(62);

for (int i = 0; i < Length; i++)

{

newRandom.Append(constant[Random.Range(0,62)]);

}

return newRandom.ToString();

}

private static char[] constant1 = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘ };

/// <summary>

/// 数字随机

/// </summary>

/// <param name="Length">要随机的位数</param>

/// <returns></returns>

public string GenerateNumber(int Length)

{

System.Text.StringBuilder newRandom = new System.Text.StringBuilder(10);

for (int i = 0; i < Length; i++)

{

newRandom.Append(constant1[Random.Range(0, 10)]);

}

return newRandom.ToString();

}

/// <summary>

/// 字符串数组随机

/// </summary>

/// <param name="chars">数组</param>

/// <param name="Length">随机的位数</param>

/// <returns></returns>

public string GetStrRandomSurname(string[] chars, int Length)

{

int count = chars.Length;

System.Text.StringBuilder newRandom = new System.Text.StringBuilder(count);

for (int i = 0; i < Length; i++)

{

newRandom.Append(chars[Random.Range(0, count)]);

}

return newRandom.ToString();

}

/// <summary>

/// 字符串*截取

/// </summary>

/// <param name="str">字符串</param>

/// <returns></returns>

public string[] getStringToList(string str)

{

return str.Split(‘*‘);

}

}

 

时间: 2024-10-11 05:11:05

(转) unity 在移动平台中,文件操作路径详解的相关文章

unity 在移动平台中,文件操作路径详解

转载自:http://www.unitymanual.com/thread-23491-1-1.html 今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够更好.更快的掌握,当然,如有不足的地方 欢迎指正!!! 相信大家在开发过程中,难免会保存一些文件在客户端进行本地化操作.如:配置文件,状态文件,Assetbundle文件等等... 最近总有人问我:1.保存了一个xml在客户端,能读取里面的数据,可是不能修改,甚至一修改就报错...2.我在电

c语言文件操作函数详解

C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 文件的读写操作 fgetc 从文件中读取一个字符 fputc 写一个字符到文件中去 fgets 从文件中读取一个字符串 fputs 写一个字符串到文件中去 fprintf 往文件中写格式化数据 fscanf 格式化读取文件中数据 fread 以二进制形式读取文件中的数据 fwrite 以二进制形式写

unity导出android遇到的build target 错误详解

1. 导出运行后显示build target ="9",version is wrong ,can't  loaded xxx.untiy3d files 之类的,一般情况看导出的jar包内的project.properties中target 是否正确,改正后而且要clean相关项目. 2.看AndroidManifest.xml下    android:minSdkVersion和android:targetSdkVersion 是否正确,改正后refresh 3.看报错信息是否提示

Git大法好——2.Git本地操作指令详解

Git大法好--2.Git本地操作指令详解 引言 上节给大家讲解了有关于Git的一些概念,Git的引入,Git的四个组成部分,Git文件的状态,以及 Git的下载安装:前面也讲过Git和SVN有个明显的差别就是,Git可以不需要网络就可以进行版本 控制,这是因为Git中每个电脑都拥有一个本地的版本库,而远程的仓库仅仅是作为我们交换修改 的一个工具!即使失去这个工具,我们也可以干活,只是交换修改不方便罢了,假如是SVN,远程 服务器挂了-所以,我们使用Git的时候大部分时间都是在进行Git的一些本

安装MACOS操作步骤详解

安装MACOS操作步骤详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于安装MAC的操作系统其实大家都知道可以让客服帮忙提供软件上的支持,而且苹果客服都很有礼貌呢,而且非常的有耐心.特别感谢她们的帮助,让我对MAC的操作系统的好感度有了大大的提升.起初,我刚刚拿到我的本的时候是去年,因为我压根并不看好笔记本,我到现在也非常喜欢台式机,因为体验度是相当棒的,但是由于工作的原因,可能是要去出差的时候带着个台式机到处跑也不太合适,于是就决定买一个低配的笔记本.刚刚拿到笔记本第

POI操作Excel详解,HSSF和XSSF两种方式

HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.

php目录操作函数详解

<?php header('content-type:text/html;charset=utf-8;'); #目录操作函数详解 // 1.getcwd(oid):若成功返回当前目录,否则返回false echo '<hr>1.getcwd():<br>'; echo getcwd(); // 2.chdir():函数把当前的目录改变为指定的目录 // chroot():函数把当前进程的根目录改为指定的目录 echo '<hr>2.chdir():<br&g

Spring Data操作Redis详解

Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis进行了很好的封装,用起来也是十分的得心应手.Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted se

Struts2之struts2文件上传详解

一.学习案例:通过在uploadfile.jsp页面填写完表单,提交后跳转到success.jsp页面,然后验证upload包下上传文件是否成功. 二.案例分析:struts2文件上传并不是表面上看的只需简单配置就可以上传文件.实际是分为两步的.1.struts2首先将客户端上传的文件保存到struts.multipart.saveDir键所指定的目录,如果该键所对应的目录不存在,就会保存到javax.servlet.context.tempdir环境变量所指定的目录中.2.Action中所定义