2017年5月15日 星期一

Unity內用C#來進行複製檔案的方式,直接File copy或Stream

當要預先在外部放置資源,等程式執行後才載入時,會視需要檢測資源檔案是否存在、移動、複製和刪除等,這邊便來記錄一下操控外部檔案進行複製的方式。

自己會做的有兩種,很簡單直接的File.Copy、和有點麻煩的FileStream方式。

首先來看File.Copy的方式,一行就輕鬆愉快地搞定;可是如果檔案很大時,那整個程式就會卡在那邊,畫面看起來就會像當機狀態,所以只適用於小型檔案和在本機端時:
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4.  
  5. public class XXX: MonoBehaviour {
  6.  
  7.     void Start()
  8.     {
  9.         if(File.Exists("D:/aaa.mp4"))
  10.         {
  11.             File.Copy("D:/aaa.mp4", "D:/bbb.mp4");
  12.         }
  13.     }
  14.  
  15.     void Update()
  16.     {
  17.  
  18.     }
  19. }
然後是FileStream的方式,雖然撰寫比較麻煩,但由於是另外執行,所以不會影響到程式裡其他部分的執行,是比較好的圓融方式,而實際上的複製速度會比File.Copy慢,適用於大型檔案和非本機端時:
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4.  
  5. public class XXX: MonoBehaviour {
  6.  
  7.     void Start()
  8.     {
  9.         if(File.Exists("D:/aaa.mp4"))
  10.         {
  11.             StartCoroutine(DownloadMovie());
  12.         }
  13.     }
  14.  
  15.     void Update()
  16.     {
  17.  
  18.     }
  19.  
  20.     IEnumerator DownloadMovie()
  21.     {
  22.         FileStream fromFileStream = null;
  23.         FileStream toFileStream = null;
  24.         byte[] buffer = new byte[32768];
  25.         int read;
  26.  
  27.         fromFileStream = new FileStream("D:/aaa.mp4", FileMode.Open);
  28.         toFileStream = new FileStream("D:/bbb.mp4", FileMode.Create);
  29.  
  30.         while ((read = fromFileStream.Read(buffer, 0, buffer.Length)) > 0)
  31.         {
  32.             toFileStream.Write(buffer, 0, read);
  33.              
  34.             yield return new WaitForSeconds(0.01f);
  35.         }
  36.  
  37.         fromFileStream.Close();
  38.         toFileStream.Close();
  39.     }
  40. }
其他還有很多方式,這裡只是笨笨的我所摸過後會用的兩種。

沒有留言:

張貼留言