1. 程式人生 > >C#檔案同步工具教程

C#檔案同步工具教程

               

我要介紹一下,用C#中FileSystemWatcher作檔案監測同步更新兩個不同目錄中檔案的小工具(A目錄中的1.txt發生改變時,B目錄中的1.txt也會自動改變以達到與A中的更新到相同的版本),讓更多的程式設計愛好者能更快的入門,

<script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>達到多學多練提高自身水平,當然,我不是牛人,還有很多不足之處,請指正(宣告:程式碼中有很多待改進的地方,因多種原因,我沒有改,完整的程式碼和一些資源,請到我的blog來下載
http://blog.csdn.net/metababy
)。

專案檔案壓縮包下載地址:

用FileSystemWatcher在MSDN裡搜,找到URL為ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemiofilesystemwatc

herclassctortopic.htm的頁面,在此頁的示例裡複製出這個程式碼片斷“  // Create a new FileSystemWatcher and set its properties.        FileSystemWatcher watcher = new FileSystemWatcher();        watcher.Path = args[1];        /* Watch for changes in LastAccess and LastWrite times, and            the renaming of files or directories. */        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite            | NotifyFilters.FileName | NotifyFilters.DirectoryName;        // Only watch text files.        watcher.Filter = "*.txt";

        // Add event handlers.        watcher.Changed += new FileSystemEventHandler(OnChanged);        watcher.Created += new FileSystemEventHandler(OnChanged);        watcher.Deleted += new FileSystemEventHandler(OnChanged);        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.        Console.WriteLine("Press /'q/' to quit the sample.");        while(Console.Read()!='q');    }

    // Define the event handlers.    private static void OnChanged(object source, FileSystemEventArgs e)    {        // Specify what is done when a file is changed, created, or deleted.       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);    }

    private static void OnRenamed(object source, RenamedEventArgs e)    {        // Specify what is done when a file is renamed.        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);    }}”=================

從工具箱裡拖FolderBrowserDialog到Form1,在視窗底部會出現folderBrowserDialog1,保持其當前狀態,按F1,並在出現的頁面上點選“Folde

rBrowserDialog建構函式,就會找到URL為ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemwindowsformsfolderb

rowserdialogclassctortopic.htm的頁面,在此頁的末尾的地方有這樣的程式碼片斷“    // Close the current file.    private void closeMenuItem_Click(object sender, System.EventArgs e)    {        richTextBox1.Text = "";        fileOpened = false;

        closeMenuItem.Enabled = false;    }

    // Bring up a dialog to chose a folder path in which to open or save a file.    private void folderMenuItem_Click(object sender, System.EventArgs e)    {        // Show the FolderBrowserDialog.        DialogResult result = folderBrowserDialog1.ShowDialog();        if( result == DialogResult.OK )        {            folderName = folderBrowserDialog1.SelectedPath;            if(!fileOpened)            {                // No file is opened, bring up openFileDialog in selected path.                openFileDialog1.InitialDirectory = folderName;                openFileDialog1.FileName = null;                openMenuItem.PerformClick();            }         }    }}”新建C#專案,選“windows應用程式”,從工具箱拖Label到Form1,在屬性欄設定其location為20,20; size為70,23; 將Text改為“源目錄”。再

拖TextBox到Form1,設定其location為16,60; size為200,21; 將Text刪除為空。再拖Button到Form1,設定其location為230,60; size為63,23; 將Text改為“瀏覽”。像上面一樣,再在適當的位置新增“目標目錄”label(location:20,104 size:80,23 text:目標目錄)和textbox(location:24,152

size:260,21 text:空,及“開始監測”button(location:130,192 size:80,23 text:開始監測)和另一個button-“瀏覽”各元件屬性列表如下:name:label1  location:20,20   size:70,23  text:“源目錄”name:textbox1  location:16,60   size:200,21  text:為空name:button1  location:230,60  size:63,23  text:“瀏覽”name:label2  location:20,104  size:80,23  text:“目標目錄”name:textbox2  location:24,152  size:260,21  text:為空name:button2  location:130,192 size:80,23  text:“開始監測”name:button3  location:232,152 size:60,23  text:“瀏覽”此時form1看起來像這樣(圖1):

在form1的設計介面上雙擊button1,轉到程式碼視窗。

在游標閃爍的位置填入前面介紹的從MSDN上選取讀目錄的程式碼,button1的雙擊處理方法現在像這樣private void button1_Click(object sender, System.EventArgs e)  {   DialogResult result = folderBrowserDialog1.ShowDialog();        if( result == DialogResult.OK )                    textBox1.Text = folderBrowserDialog1.SelectedPath;  }轉到form1的設計介面,雙擊button3,將button3的雙擊處理方法改為這樣:private void button3_Click(object sender, System.EventArgs e)  {   DialogResult result = folderBrowserDialog1.ShowDialog();   if( result == DialogResult.OK )            textBox2.Text = folderBrowserDialog1.SelectedPath;  }在button2的處理方法里加入監測程式碼,完成後的程式碼,如下:private void button2_Click(object sender, System.EventArgs e)  {   FileSystemWatcher watcher = new FileSystemWatcher();   watcher.Path = textBox1.Text; //監測目錄改為textbox1.text   /* 此程式碼片斷是MSDN裡找的,前面介紹過的 */   watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite     | NotifyFilters.FileName | NotifyFilters.DirectoryName;   // Only watch text files.   watcher.Filter = "";

   // Add event handlers.   watcher.Changed += new FileSystemEventHandler(OnChanged);   watcher.Created += new FileSystemEventHandler(OnChanged);   watcher.Deleted += new FileSystemEventHandler(OnDeleted);   watcher.Renamed += new RenamedEventHandler(OnRenamed);

   // Begin watching.   watcher.EnableRaisingEvents = true;

  }

注意在程式碼最前面加入using System.IO;using System.Diagnostics;這兩個名稱空間。在button3的處理方法後,再加入三個方法,程式碼如下:  private void OnChanged(object source, FileSystemEventArgs e)  {   // Specify what is done when a file is changed, created, or deleted.   File.Copy(this.textBox1.Text+"//"+e.Name,this.textBox2.Text+"//"+e.Name,true);  }

  private void OnRenamed(object source, RenamedEventArgs e)  {   // Specify what is done when a file is renamed.   File.Copy(this.textBox1.Text+"//"+e.Name,this.textBox2.Text+"//"+e.Name,true);  }

  private void OnDeleted(object source, FileSystemEventArgs e)  {   File.Delete(this.textBox2.Text+"//"+e.Name);  }

完整的程式碼和一些資源,請到我的blog來下載http://blog.csdn.net/metababy另:這個工具,很簡單,沒有加入處理異常的程式碼,也沒有處理當前目錄下的子目錄的功能,這些,你可以自己找幫助看MSDN加入。

using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.IO;using System.Diagnostics;

namespace 檔案同步工具{ /// <summary> /// Form1 的摘要說明。 /// </summary> public class Form1 : System.Windows.Forms.Form {  private System.Windows.Forms.Label label1;  private System.Windows.Forms.TextBox textBox1;  private System.Windows.Forms.Button button1;  private System.Windows.Forms.Label label2;  private System.Windows.Forms.TextBox textBox2;  private System.Windows.Forms.Button button2;  private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1;  private System.Windows.Forms.Button button3;  /// <summary>  /// 必需的設計器變數。  /// </summary>  private System.ComponentModel.Container components = null;

  public Form1()  {   //   // Windows 窗體設計器支援所必需的   //   InitializeComponent();

   //   // TODO: 在 InitializeComponent 呼叫後新增任何建構函式程式碼   //  }

  /// <summary>  /// 清理所有正在使用的資源。  /// </summary>  protected override void Dispose( bool disposing )  {   if( disposing )   {    if (components != null)     {     components.Dispose();    }   }   base.Dispose( disposing );  }

  #region Windows 窗體設計器生成的程式碼  /// <summary>  /// 設計器支援所需的方法 - 不要使用程式碼編輯器修改  /// 此方法的內容。  /// </summary>  private void InitializeComponent()  {   this.label1 = new System.Windows.Forms.Label();   this.textBox1 = new System.Windows.Forms.TextBox();   this.button1 = new System.Windows.Forms.Button();   this.label2 = new System.Windows.Forms.Label();   this.textBox2 = new System.Windows.Forms.TextBox();   this.button2 = new System.Windows.Forms.Button();   this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();   this.button3 = new System.Windows.Forms.Button();   this.SuspendLayout();   //    // label1   //    this.label1.Location = new System.Drawing.Point(20, 20);   this.label1.Name = "label1";   this.label1.Size = new System.Drawing.Size(70, 23);   this.label1.TabIndex = 0;   this.label1.Text = "源目錄";   //    // textBox1   //    this.textBox1.Location = new System.Drawing.Point(16, 60);   this.textBox1.Name = "textBox1";   this.textBox1.Size = new System.Drawing.Size(200, 21);   this.textBox1.TabIndex = 1;   this.textBox1.Text = "";   //    // button1   //    this.button1.Location = new System.Drawing.Point(230, 60);   this.button1.Name = "button1";   this.button1.Size = new System.Drawing.Size(63, 23);   this.button1.TabIndex = 2;   this.button1.Text = "瀏覽";   this.button1.Click += new System.EventHandler(this.button1_Click);   //    // label2   //    this.label2.Location = new System.Drawing.Point(20, 104);   this.label2.Name = "label2";   this.label2.Size = new System.Drawing.Size(80, 23);   this.label2.TabIndex = 3;   this.label2.Text = "目標目錄";   //    // textBox2   //    this.textBox2.Location = new System.Drawing.Point(24, 152);   this.textBox2.Name = "textBox2";   this.textBox2.Size = new System.Drawing.Size(200, 21);   this.textBox2.TabIndex = 4;   this.textBox2.Text = "";   //    // button2   //    this.button2.Location = new System.Drawing.Point(130, 192);   this.button2.Name = "button2";   this.button2.Size = new System.Drawing.Size(80, 23);   this.button2.TabIndex = 5;   this.button2.Text = "開始監測";   this.button2.Click += new System.EventHandler(this.button2_Click);   //    // button3   //    this.button3.Location = new System.Drawing.Point(232, 152);   this.button3.Name = "button3";   this.button3.Size = new System.Drawing.Size(60, 23);   this.button3.TabIndex = 6;   this.button3.Text = "瀏覽";   this.button3.Click += new System.EventHandler(this.button3_Click_1);   //    // Form1   //    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);   this.ClientSize = new System.Drawing.Size(292, 273);   this.Controls.Add(this.button3);   this.Controls.Add(this.button2);   this.Controls.Add(this.textBox2);   this.Controls.Add(this.label2);   this.Controls.Add(this.button1);   this.Controls.Add(this.textBox1);   this.Controls.Add(this.label1);   this.Name = "Form1";   this.Text = "Form1";   this.ResumeLayout(false);

  }  #endregion

  /// <summary>  /// 應用程式的主入口點。  /// </summary>  [STAThread]  static void Main()   {   Application.Run(new Form1());  }

  private void button1_Click(object sender, System.EventArgs e)  {   DialogResult result = folderBrowserDialog1.ShowDialog();        if( result == DialogResult.OK )                    textBox1.Text = folderBrowserDialog1.SelectedPath;  }

  private void button2_Click(object sender, System.EventArgs e)  {   FileSystemWatcher watcher = new FileSystemWatcher();   watcher.Path = textBox1.Text; //監測目錄改為textbox1.text   /* 此程式碼片斷是MSDN裡找的,前面介紹過的 共純春製作的示範程式,很多問題,沒有解決的,更多請到我的blog

http://blog.csdn.net/metababy*/   watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite     | NotifyFilters.FileName | NotifyFilters.DirectoryName;   // Only watch text files.   watcher.Filter = "";

   // Add event handlers.   watcher.Changed += new FileSystemEventHandler(OnChanged);   watcher.Created += new FileSystemEventHandler(OnChanged);   watcher.Deleted += new FileSystemEventHandler(OnDeleted);   watcher.Renamed += new RenamedEventHandler(OnRenamed);

   // Begin watching.   watcher.EnableRaisingEvents = true;

  }

  private void button3_Click_1(object sender, System.EventArgs e)  {   DialogResult result = folderBrowserDialog1.ShowDialog();   if( result == DialogResult.OK )            textBox2.Text = folderBrowserDialog1.SelectedPath;    }  private void OnChanged(object source, FileSystemEventArgs e)  {   // Specify what is done when a file is changed, created, or deleted.   File.Copy(this.textBox1.Text+"//"+e.Name,this.textBox2.Text+"//"+e.Name,true);  }

  private void OnRenamed(object source, RenamedEventArgs e)  {   // Specify what is done when a file is renamed.   File.Copy(this.textBox1.Text+"//"+e.Name,this.textBox2.Text+"//"+e.Name,true);  }

  private void OnDeleted(object source, FileSystemEventArgs e)  {   File.Delete(this.textBox2.Text+"//"+e.Name);  }

 }}