2019年9月24日 星期二

Unity內偵測外部資料夾內的檔案變化

有很多案子是需要為使用者留下記錄、和二次使用該記錄等,因此像是當拍下使用者的照片、為使用者製作的卡片、或是為使用者錄製的音檔等,會放置在指定的資料夾內,而其他程式會偵測那些指定資料夾內是否有新檔案出現,有的話便會拿來使用,達成一種更新的狀態。

以前我是會很笨地用List記住資料夾內的檔案,然後每幾秒便用For迴圈去比對檢查,現在有空去研究,便發現了王道方法,輕鬆且簡單。

C#有FileSystemWatcher這個Library,專門用來監視資料夾檔案狀態,因此簡單地設定和啟用,便可為程式去監聽指定的資料夾內檔案狀態。

  1. using System.Collections;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using System.IO;
  6.  
  7. public class XXX : MonoBehaviour {
  8.  
  9. private FileSystemWatcher fileSystemWatcher;
  10.  
  11. void Start ()
  12. {
  13. DetectFileAction();
  14. }
  15. void Update ()
  16. {
  17. }
  18.  
  19. public void DetectFileAction()
  20. {
  21. fileSystemWatcher = new FileSystemWatcher("S:/Data/", "*.txt");
  22.  
  23. fileSystemWatcher.Created += OnChanged;
  24. fileSystemWatcher.Renamed += OnChanged;
  25. fileSystemWatcher.Changed += OnChanged;
  26. fileSystemWatcher.Deleted += OnChanged;
  27. fileSystemWatcher.EnableRaisingEvents = true;
  28. }
  29. void OnChanged(object source, FileSystemEventArgs e)
  30. {
  31. Debug.Log("有檔案被" + e.ChangeType + " = " + e.FullPath);
  32. }
  33. }

可以看到我偵測四種狀態:創造檔案、重新命名檔案、改變檔案的內容和刪除檔案。

fileSystemWatcher.EnableRaisingEvents是指啟動此程序的意思。

由上而下分別是創造檔案、重新命名檔案、改變檔案的內容和刪除檔案時所出現的相對應訊息,這邊特地列出是為了表明有些時候做某個動作,所得到的回饋會不只一個。

最後有一個很重要的是,如果是較大的檔案,最好不要接收到訊息便立即拿來使用。例如我用Web攝影機錄製了一段使用者的影像,並且將影片儲存到某個資料夾內;雖然其他的程式會立刻接收到Created的訊息,但是檔案實際上可能還沒有創建完成,所以若立即取得並播放的話很可能是白色畫面,因此我都會等一兩秒後再來處理。