• C#文件同步工具教程


    我要介绍一下,用C#中FileSystemWatcher作文件监测同步更新两个不同目录中文件的小工具(A目录中的1.txt发生改变时,B目录中的1.txt也会自动改变以达到与A中的更新到相同的版本),让更多的编程爱好者能更快的入门,达到多学多练提高自身水平,当然,我不是牛人,还有很多不足之处,请指正(声明:代码中有很多待改进的地方,因多种原因,我没有改,完整的代码和一些资源,请到我的blog来下载http://blog.csdn.net/metababy)。

    项目文件压缩包下载地址:

    https://files.cnblogs.com/meta/文件同步工具.rar


    用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);
      }

     }
    }

  • 相关阅读:
    UML模型
    Clustering vs. Witness SQL Server AlwaysOn vs. Database Mirroring
    工具软件推荐
    用StyleCop规范团队代码
    个人整理的Knockout.js文档,有兴趣的朋友可以直接下载!
    认识ASP.NET MVC的5种AuthorizationFilter
    深入探讨ASP.NET MVC的筛选器
    如何在调用WCF服务之前弹出一个确认对话框?
    愤青,哀哉我本愤青幸哉
    vs2005入门 .Net2.0视频教程 之 DataSet深入使用 [视频]
  • 原文地址:https://www.cnblogs.com/meta/p/392522.html
Copyright © 2020-2023  润新知