Unity3D學習筆記(二十五):文件操作
阿新 • • 發佈:2019-02-12
log gin fin 不同 ati text組件 內容 mono www 文件是什麽?
存儲在硬盤上的最後的節點。
文件夾是什麽?
文件的上級單位稱為文件夾。
文件夾的基本結構?
文件夾是層級化結構的,對於同級的文件夾不可以重名,父文件夾和子文件夾可以同名》
IO:I是Input輸入,O是Output輸出
IO流:指數據的輸入輸出流。
命名空間:using System.IO;
Directory文件夾類:操作文件夾的類,靜態類,靜態方法,工具類,不能實例化,通過類名調用
API:Directory.GetCurrentDirectory();//獲取當前應用程序(工程)的絕對路徑
API:Directory.Exists()//;判斷指定的文件夾路徑是否存在
API:Directory.CreateDirectory();//創建文件夾
API:Directory.Delete();//刪除文件夾
API:Directory.Move();//移動文件夾,可以通過這種方式來實現文件夾的重命名
API:獲取指定路徑下所有文件夾和文件的絕對路徑的數組
API:Directory.GetFiles();//獲取文件夾下的所有文件
API:Directory.GetDirectories();//獲取指定路徑下的所有文件夾
API:獲得創建時間,最後訪問和最後修改時間
GetCreationTime,GetLastAccessTime,GetLastWriteTime
API:設置創建時間,最後訪問和最後修改時間
SetCreationTime,SetLastAccessTime,SetLastWriteTime
usingSystem.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class LessonFile : MonoBehaviour { // Use this for initialization void Start () { //判斷文件是否存在 if (File.Exists(@"D:\桌面\Directory\Text.txt")) { Debug.Log("文件存在"); } //刪除文件,註意文件的後綴 File.Delete(@"D:\桌面\Directory\Text.txt"); //移動文件,可以通過這種方式來對文件進行重命名,註意後綴名 //文件名可以不同,後綴名也可以不同(改變文件的類型) File.Move(@"D:\桌面\Directory\JPG.jpg", @"D:\桌面\Directory\PNG.png"); //拷貝文件,前後名字可以不一致,後綴名也可以不一致 File.Copy(@"D:\桌面\Directory\PNG.png", @"D:\桌面\Directory\GIF.gif"); //創建文件 FileStream fsCreate = File.Create(@"D:\桌面\Directory\Create.txt"); fsCreate.Close();//關閉文件流 } // Update is called once per frame void Update () { } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class LessonDirectory : MonoBehaviour { // Use this for initialization void Start () { //獲取當前應用程序(工程)的絕對路徑 Directory.GetCurrentDirectory(); Debug.Log(Directory.GetCurrentDirectory()); //@取消轉義 string str = @"\"; Debug.Log(str); //判斷指定的文件夾路徑是否存在 if (Directory.Exists(@"D:\桌面\Directory")) { Debug.Log("Directory文件夾存在"); } //創建文件夾 Directory.CreateDirectory(@"D:\桌面\Directory\File1"); Directory.CreateDirectory(@"D:\桌面\Directory\File2"); //刪除文件夾,對於文件夾裏有文件的情況,如果使用一個參數去刪除會報錯 //對於文件夾裏有文件的情況,我們使用重載的第二個參數傳入true表示強制刪除 Directory.Delete(@"D:\桌面\Directory\File1"); //移動文件夾,可以通過這種方式來實現文件夾的重命名 Directory.Move(@"D:\桌面\Directory\File2", @"D:\桌面\Directory\File3"); //獲取文件夾下的所有文件 string[] files = Directory.GetFiles(@"D:\桌面\Directory"); foreach (var item in files) { Debug.Log(item); } //獲取指定路徑下的所有文件夾 string[] directorys = Directory.GetDirectories(@"D:\桌面"); foreach (var item in directorys) { Debug.Log(item); } } // Update is called once per frame void Update () { } }@取消轉義 str="\n":默認情況下,“\”在字符串中表示轉義符 str=@"\n":如果一個字符串前加了@符號,表示取消轉義;那麽“\”將作為字符存在,不代表轉移符 "\\":單斜杠“\”在字符串裏是轉義符,雙斜杠"\\"在字符串裏表示單斜杠“\” File文件類 命名空間:using System.Text; API:File.Create();//創建文件 API:File.Open();//打開文件 FileMode ----Open:打開一個已有的文件,保證文件路徑是正確的 ----Create:創建一個新文件,如果該文件已經存在,那麽新文件覆蓋掉舊文件 ----CreateNew:創建一個新文件,但是得保證該文件是不存在的,如果存在會報錯 ----OpenOrCreate:如果存在即打開文件,如果不存在即創建新文件 ----Append:打開文件,並且文件的遊標在最後,追加模式 創建文件,打開文件,返回的都是文件流
打開一個文件流之後,一定要關閉,否則會占用
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class LessonFile : MonoBehaviour { // Use this for initialization void Start () { //判斷文件是否存在 if (File.Exists(@"D:\桌面\Directory\Text.txt")) { Debug.Log("文件存在"); } //刪除文件,註意文件的後綴 File.Delete(@"D:\桌面\Directory\Text.txt"); //移動文件,可以通過這種方式來對文件進行重命名,註意後綴名 //文件名可以不同,後綴名也可以不同(改變文件的類型) File.Move(@"D:\桌面\Directory\JPG.jpg", @"D:\桌面\Directory\PNG.png"); //拷貝文件,前後名字可以不一致,後綴名也可以不一致 File.Copy(@"D:\桌面\Directory\PNG.png", @"D:\桌面\Directory\GIF.gif"); //創建文件 FileStream fsCreate = File.Create(@"D:\桌面\Directory\Create.txt"); fsCreate.Close();//關閉文件流 } // Update is called once per frame void Update () { } }字節數組的傳遞是引用傳遞,改變當前文本的值會改變原有文本的值 讀取文本文件時:解析字節數組時,需要使用對應的編碼格式 字符編碼種類 1、ASCII:ASCII碼是西歐編碼的方式,采取7位編碼,所以是2^7=128,共可以表示128個字符,包括34個字符,(如換行LF,回車CR等),其余94位為英文字母和標點符號及運算符號等。 2、GB2321:GB2312 是對 ASCII 的中文擴展。兼容ASCII。 3、GBK:GBK 兼容ASCLL 兼容 GB2312 是GB2312的擴展。 4、Unicode:Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。 5、UTF-8:UTF-8以字節為單位對Unicode進行編碼。 亂碼: 1、使用了不同的編碼格式進行解析文本 2、讀取的內容少了,也有可能出現亂碼 UTF-8,3個字節表示1個漢字,缺少3個字節會少1個漢字,缺少2個字節會亂碼 關閉文件的問題:代碼運行中出錯,沒有執行最後關閉文件的代碼 Try Catch: 先依次執行Try語句塊的代碼,一但發現有錯誤,不會繼續執行Try裏的代碼,直接跳到Catch塊裏依次執行Catch塊裏的代碼,Catch塊裏的代碼執行完繼續向下執行。如果Try裏的代碼沒有錯誤,不會執行Catch裏的代碼,直接執行Catch塊後的代碼
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LessonTryCatch : MonoBehaviour { public GameObject obj; // Use this for initialization void Start () { Debug.Log("開始try"); try { Debug.Log("try 語句塊!"); Debug.Log(obj.name);//這句話一定會報錯,跳轉catch Debug.Log("打印名字"); } catch (System.Exception e) { Debug.Log("catch 語句塊!" + e); Debug.Log("錯誤信息:" + e); Debug.Log(obj.name);//如果catch報錯,之後的代碼都不會執行 } Debug.Log("結束try"); } // Update is called once per frame void Update () { } }
作業:讀取文本內容,顯示在UI的text組件上,並實現內容滾動
文本位置調整
文本自動擴容
讀取文件
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Text; using UnityEngine.UI; public class LessonHomework : MonoBehaviour { public const string filePath = @"D:\桌面\1.txt"; private Text text; private void Awake() { text = transform.Find("Mask/Text").GetComponent<Text>(); } // Use this for initialization void Start () { FileStream fs = File.Open(filePath, FileMode.Open); try { byte[] bytes = new byte[fs.Length]; int ret = fs.Read(bytes, 0, (int)fs.Length); string str = Encoding.UTF8.GetString(bytes); text.text = str; } catch (System.Exception e) { Debug.Log(e.ToString()); } fs.Close(); } // Update is called once per frame void Update () { } }
寫入文件
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Text; public class LessonWriteFile : MonoBehaviour { public const string filePath = @"D:\桌面\Directory\ReadFile.txt"; // Use this for initialization void Start () { //string filePath1 = Directory.GetCurrentDirectory(); //filePath1 = filePath1 + "\\Directory\\"; //寫入文本文件 //1、打開文件 FileStream fs = File.Open(filePath, FileMode.Open); // FileStream fs = File.Open(filePath, FileMode.Append);//追加模式 Debug.Log("遊標的位置:" + fs.Position); //第一個參數:向前移或向後移多少位,第二個參數:從什麽位置開始移動 //對於想要把遊標移動到文件的末尾 //方法1 fs.Seek(fs.Length, SeekOrigin.Begin); //方法2 fs.Seek(fs.Length - fs.Position, SeekOrigin.Current); //方法3 fs.Seek(0, SeekOrigin.End); //對於想要把遊標移動到文件的開始 //方法1 fs.Seek(0, SeekOrigin.Begin); //方法2 fs.Seek(-fs.Position, SeekOrigin.Current); //方法3 fs.Seek(-fs.Length, SeekOrigin.End); Debug.Log("遊標的位置:" + fs.Position); //為了保證文件打開之後一定能關閉,文件操作寫在Try Catch裏 try { //2、把要寫入的內容轉成字節數組 string str = "做一只快樂的小魚苗~"; byte[] bytes = Encoding.UTF8.GetBytes(str); //3、寫入文件 //第一個參數:寫入文件的內容轉換成的字符串 //第二個參數:從字節數組中的第幾位開始寫入 //第三個參數:從字節數組中寫入多少位 fs.Write(bytes, 0, bytes.Length); } catch (System.Exception e) { Debug.Log(e.ToString()); } //最終關閉文件流 fs.Close(); } // Update is called once per frame void Update () { } }文本讀寫器 文本讀
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class LessonStreamReader : MonoBehaviour { public const string filePath = @"D:\桌面\Directory\ReadFile.txt"; // Use this for initialization void Start () { //文本讀寫器 //打開文件,保證路徑是正確的,有效的 StreamReader sr = new StreamReader(filePath, System.Text.Encoding.UTF8); try { //string str = sr.ReadLine();//只讀取一行。 string str = sr.ReadToEnd();//從開始讀到結尾 Debug.Log("讀取的內容: " + str); } catch (System.Exception e) { Debug.Log(e.ToString()); } //最後一定要關閉文件 sr.Close(); } // Update is called once per frame void Update () { } }
文本寫,不能操作遊標,如果不使用追加模式,默認清空原有內容,重新寫入
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class LessonStreamWrite : MonoBehaviour { public const string filePath = @"D:\桌面\Directory\ReadFile.txt"; // Use this for initialization void Start () { //文本讀寫器 //1、打開文件 //這個重載,會把文件內容全部清除,重新寫入內容 //StreamWriter sw = new StreamWriter(filePath); //這個重載,是追加模式,第二個參數指定是否追加,第三個參數是指定編碼格式 StreamWriter sw = new StreamWriter(filePath, true, System.Text.Encoding.UTF8); try { sw.Write("Hello World!"); } catch (System.Exception e) { Debug.Log(e.ToString()); } //最後一定關閉文件 sw.Close(); } // Update is called once per frame void Update () { } }文件拷貝 小文件的直接拷貝 大文件的線程拷貝 1、使用多線程的方式,防止文件過大,卡死主線程 2、多線程裏面不能改變需要渲染操作的值(例如改變slider的進度條的值) 3、多線程裏使用while循環,要設置跳出循環的條件
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Threading; public class LessonCopyFile : MonoBehaviour { public UnityEngine.UI.Slider slider; public const string sourceFilePath = @"D:\桌面\1.rar"; public const string targetFilePath = @"D:\桌面\2.rar"; private float maxValue = 1f; private float currentValue; private bool isStop = false; // Use this for initialization void Start () { //小文件的拷貝 //CopyFile(sourceFilePath, targetFilePath); //大文件的拷貝 //TestCopyFile(); //大文件的線程拷貝 //1.申請一個Thread的對象 Thread th = new Thread(TestCopyFile); //2.啟動這個線程 th.Start(); } // Update is called once per frame void Update () { //滑動條賦值 slider.normalizedValue = currentValue / maxValue; } private void OnDestroy() { isStop = true; } //小文件的拷貝 void CopyFile(string sourceFile, string targetFile) { //拷貝,就把源文件的內容寫入到新的文件中 //1.讀取源文件的內容 FileStream source = File.Open(sourceFile, FileMode.Open); byte[] bytes = new byte[source.Length]; try { //讀取內容 source.Read(bytes, 0, bytes.Length); } catch (System.Exception e) { Debug.Log(e.ToString()); } source.Close(); //2.寫入新文件 FileStream target = File.Open(targetFile, FileMode.Create); try { //寫入新文件 target.Write(bytes, 0, bytes.Length); } catch (System.Exception e) { Debug.Log(e.ToString()); } target.Close(); } void TestCopyFile() { Debug.Log("開始拷貝"); CopyBigFile(sourceFilePath, targetFilePath); Debug.Log("拷貝結束"); } void CopyBigFile(string sourceFile, string targetFile) { FileStream source = new FileStream(sourceFile, FileMode.Open); FileStream target = new FileStream(targetFile, FileMode.Create); byte[] bytes = new byte[100];//限制每次拷貝100 * 1024個字節大小的內容 maxValue = source.Length; try { long readCount = 0; //必須保證所有的內容都寫入到另一個文件中了, 跳出循環 //只要保證每次讀取的長度的累加值 大於等於 文件流的大小 while (readCount < source.Length) { int length = source.Read(bytes, 0, bytes.Length); target.Write(bytes, 0, length); readCount += length; currentValue = readCount; //當組件銷毀時,停止多線程裏的while循環,防止程序停止運行時,多線程仍在執行 if (isStop) { break; } } } catch (System.Exception e) { Debug.Log(e.ToString()); } source.Close(); target.Close(); } }圖片加載並顯示UI組件中 方法一: 1、把圖片轉換成字節數組 2、把字節數組轉換成圖片,loadImage 方法二: 1、本地加載,加file:\\ 2、網絡加載,使用協程
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using UnityEngine.UI; public class LessonLoadTexture : MonoBehaviour { public RawImage image; // Use this for initialization void Start () { image.texture = LoadFileTexture(@"D:\桌面\1.jpg"); image.SetNativeSize(); //加載網上的 //StartCoroutine(LoadTexture(@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1527592090920&di=60ad08a7d15d3f91e7a370a9479b5d50&imgtype=0&src=http%3A%2F%2Fimage.yy.com%2Fyywebalbumbs2bucket%2Ffa63ba48c11f46278f9f2be98a141138_1499771837216.jpeg")); //加載本地的 如果要www加載本地的圖片,那麽在路徑前要加 file:// //StartCoroutine(LoadTexture(@"file://D:\桌面\1.jpg")); } // Update is called once per frame void Update () { } Texture LoadFileTexture(string filePath) { //把圖片轉換成字節數組 FileStream fs = File.Open(filePath, FileMode.Open); byte[] bytes = new byte[fs.Length]; try { fs.Read(bytes, 0, bytes.Length); } catch (System.Exception e) { Debug.Log(e.ToString()); } fs.Close(); //把字節數組轉換成圖片 Texture2D tex = new Texture2D(0, 0); if (tex.LoadImage(bytes))//把從字節數組中加載圖片 { return tex; } else { return null; } } IEnumerator LoadTexture(string path) { WWW www = new WWW(path); yield return www;//圖片加載完成後,在執行後面的步驟 //string.IsNullOrEmpty(error) 判斷error不能為null 也不能為“” if (www != null && string.IsNullOrEmpty(www.error)) { image.texture = www.texture; image.SetNativeSize(); } else { Debug.LogError("加載錯誤"); } } }
Unity3D學習筆記(二十五):文件操作