2013年11月29日 星期五

[C#]使用FileSystemWatcher偵測資料夾是否有新增檔案,並移動該檔案

回答論壇問題順便寫了簡單的Sample Code,順便做個小記錄 :P
 FileSystemWatcher可以在某個資料夾有檔案異動時,觸發事件,然後可以針對這些檔案做這些事,直覺就想到我在匯入相機的照片時,檔名都不是我想要的,所以就寫個小程式讓我再copy檔案時,能直接搬移這些檔案並更名。
FileSystemWatcher共用以下事件可用(圖片來自MSDN)
image
本例使用Created來實現,首先新增一個Windows Form專案,並在初始化後撰寫以下Code:
public Form1()
{
     InitializeComponent();
     //設定針測的檔案類型,如不指定可設定*.*
     FileSystemWatcher watch = new FileSystemWatcher(OriginAlbum, "*.jpeg");
     //開啟監聽
     watch.EnableRaisingEvents = true;
     //是否連子資料夾都要偵測
     watch.IncludeSubdirectories = true;
     //新增時觸發事件
     watch.Created += watch_Created;
}

void watch_Created(object sender, FileSystemEventArgs e)
{
     string DirectPath = e.FullPath;
     //TODO 實做抓取檔案,並移動更名檔案
}


e.FullPath就可以接到該目錄,就可以實做一些事

完整程式碼:

string OriginAlbum = @"D:\temp2"; //針測的資料夾
string NewAlbum = @"D:\Album"; //搬移後的資料夾

public Form1()
{
     InitializeComponent();
     //設定針測的檔案類型,如不指定可設定*.*
     FileSystemWatcher watch = new FileSystemWatcher(OriginAlbum, "*.jpeg");
     //開啟監聽
     watch.EnableRaisingEvents = true;
     //是否連子資料夾都要偵測
     watch.IncludeSubdirectories = true;
     //新增時觸發事件
     watch.Created += watch_Created;
}

void watch_Created(object sender, FileSystemEventArgs e)
{
     string DirectPath = e.FullPath;
     //如果偵測到為檔案,則依路徑對此資料夾做檔案處理
     if (IsFilePath(DirectPath))
     {
          string fileFormat = "{0}-{1}.jpeg"; //檔名格式
          string FileDate = DateTime.Today.ToShortDateString();
          string CreateAlbum = NewAlbum + @"\" + FileDate;

          string DirectoryName = Path.GetDirectoryName(e.FullPath); //該檔案的資料夾名稱
          var files = Directory.GetFiles(DirectoryName, @"*.*"); //取得資料夾所有檔案

          //如果該資料夾存在檔案,則刪除檔案
          if (System.IO.Directory.Exists(CreateAlbum))
          {
               DeleteAllFile(CreateAlbum);
          }
          else
          {
               System.IO.Directory.CreateDirectory(CreateAlbum);
          }

          int i = 0;
          foreach (string f in files)
          {
               Console.WriteLine("task:"+f);
               //依順序改檔名
               System.IO.Directory.CreateDirectory(DirectoryName);
               string fileCount = (++i).ToString("D3");
               string newFileName = System.IO.Path.Combine(CreateAlbum, string.Format(fileFormat, FileDate, fileCount));
               //搬移ReName後的檔案
               System.IO.File.Move(f, newFileName);
          }
     }
    
}

--

Reference

http://msdn.microsoft.com/zh-tw/library/system.io.filesystemwatcher.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

http://www.dotblogs.com.tw/dotnetfactory/archive/2008/04/10/2780.aspx

http://www.dotblogs.com.tw/yc421206/archive/2009/01/18/6861.aspx

http://www.dotblogs.com.tw/jaigi/archive/2013/08/21/115097.aspx

沒有留言:

張貼留言