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來下載專案檔案壓縮包下載地址:
用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); }
}}