一.在項目根目錄中創建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來讀取文件進行操作。
#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
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.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
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('*');
}
}