净心编程

大音希声,大象无形……〖http://anforen.5d6d.com〗<<<===请记住永久域名 @ 花纯春

用户操作
[即时聊天] [发私信] [加为好友]
花纯春ID:metababy
2017478次访问,排名4好友206人,关注者258
人若无名,可潜心研究技术
metababy的文章
原创 1239 篇
翻译 66 篇
转载 355 篇
评论 726 篇
花纯春的公告
安福瑞论坛
四角号码查询器
文件同步工具
剪切板记录器


最近评论
aday:eclispe就像一只蜗牛,每次eclispe更新都要下载来试用,结果每次都失望。
Esun:妈的,睁着眼说瞎话呢,在IT世界中,好东西立显,Hyper-V 比 VMware 还是有差距的。。。
huang96962:MS产品有点慢
thesameway:51旧书网 同城易书
www.51jiushu.com
www.51jiushu.net
二手书、旧书同城交易平台
分类齐全、快速发布、准确搜索
zhj8407:这哥们是微软的托?
文章分类
收藏
    相册
    google
    软件相关
    问题
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 C#文件同步工具教程收藏

    新一篇: 如何干掉冰点还原软件-Kill Deep Freeze [绝对可行但不是唯一的办法] | 旧一篇: 网友收集:国内热门软件作者真人照片(多图)

    我要介绍一下,用C#中FileSystemWatcher作文件监测同步更新两个不同目录中文件的小工具(A目录中的1.txt发生改变时,B目录中的1.txt也会自动改变以达到与A中的更新到相同的版本),让更多的编程爱好者能更快的入门,

    达到多学多练提高自身水平,当然,我不是牛人,还有很多不足之处,请指正(声明:代码中有很多待改进的地方,因多种原因,我没有改,完整的代码和一些资源,请到我的blog来下载http://blog.csdn.net/metababy)。

     

     

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

    http://www.cnblogs.com/Files/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);
      }

     

     

     }
    }

    发表于 @ 2006年05月06日 12:03:00|评论(loading...)|编辑

    新一篇: 如何干掉冰点还原软件-Kill Deep Freeze [绝对可行但不是唯一的办法] | 旧一篇: 网友收集:国内热门软件作者真人照片(多图)

    评论

    #binoculars 发表于2007-03-07 20:46:18  IP: 61.50.130.*
    你好,看了这些我很感兴趣,我也在研究文件同步问题,如果可以能否和我联系一下,qq:20985775,麻烦您了
    #yimsungnam 发表于2007-05-31 19:59:37  IP: 211.167.93.*
    你好, 我按你的方法写了个简单的程序,
    在Form_load过程中加了
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    把文件内容更改后, 进行保存, 那么OnChanged事件会被调用两次. 这是为什么? 是正常的行为吗?

    希望你能回复我, 谢谢..
    E-Mail: yimsungnam@126.com
    #luohuapiaoyi 发表于2008-01-21 09:03:45  IP: 218.19.43.*
    更新跟保存已经是2个动作改变了
    #luohuapiaoyi 发表于2008-01-21 09:04:26  IP: 218.19.43.*
    说错了,应该是更改和保存
    #luohuapiaoyi 发表于2008-01-21 09:05:18  IP: 218.19.43.*
    其实除了FileSystemWatcher ,其他没什么
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 花纯春