====== C#文件同步工具教程 ====== 來源:http://www.cnblogs.com/meta/archive/2006/05/06/392522.html 我要介紹一下,用C#中FileSystemWatcher作文件監測同步更新兩個不同目錄中文件的小工具(A目錄中的1.txt發生改變時,B目錄中的1.txt也會自動改變以達到與A中的更新到相同的版本),讓更多的編程愛好者能更快的入門,達到多學多練提高自身水平,當然,我不是牛人,還有很多不足之處,請指正(聲明:代碼中有很多待改進的地方,因多種原因,我沒有改,完整的代碼和一些資源,請到我的blog來下載http://blog.csdn.net/metababy)。 項目文件壓縮包下載地址: [[http://files.cnblogs.com/meta/文件同步工具.rar]]\\ 本地下載: {{ :program:csharp:文件同步工具.rar |}} 用FileSystemWatcher在MSDN裡搜,找到URL為 ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemiofilesystemwatcherclassctortopic.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,並在出現的頁面上點擊「FolderBrowserDialog構造函數,就會找到URL為 ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemwindowsformsfolderbrowserdialogclassctortopic.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):\\ {{:program:csharp:o_1.jpg|}} 在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 文件同步工具 { /// /// Form1 的摘要說明。 /// 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; /// /// 必需的設計器變量。 /// private System.ComponentModel.Container components = null; public Form1() { // // Windows 窗體設計器支持所必需的 // InitializeComponent(); // // TODO: 在 InitializeComponent 調用後添加任何構造函數代碼 // } /// /// 清理所有正在使用的資源。 /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows 窗體設計器生成的代碼 /// /// 設計器支持所需的方法 - 不要使用代碼編輯器修改 /// 此方法的內容。 /// 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 /// /// 應用程序的主入口點。 /// [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); } } }