1. 程式人生 > >Unity3D學習筆記(二十五):文件操作

Unity3D學習筆記(二十五):文件操作

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
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 () { } }

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學習筆記(二十五):文件操作