zoukankan      html  css  js  c++  java
  • 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);
      }

     }
    }

  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/meta/p/392522.html
Copyright © 2011-2022 走看看