有一目录需要拷贝到硬盘其他地方目录里有若干级子目录和文件思路应该是递规遍历吧大家帮帮忙啊

解决方案 »

  1.   

    将用来拷贝文件的主要类: 
    class DoWorks 

    //定一个一个委托 
    public delegate void CopyFileHandler(long lngPosition, long LngCount); 
    //定义一个事件(很重要),这个事件将被主线程捕捉,并对主线程的内容进行更改,比如:进度条。 
    public event CopyFileHandler CopyFileEvent; 
    //定义两个字符串变量,sFile表示源文件,tFile表示目标文件,当然,这个可以使用属性的方式,这个为了简单明了,直接使用共有变量。 
    public System.String sFile; 
    public System.String tFile; //这个就是工作线程使用到的方法了。 
    public void CopyFile() 

    //定义一个字节数组,用来缓存从源文件读到的字节流。 
    byte[] fb = new byte[2048]; 
    //定义当前已读字节数,用于主线程更新界面。 
    long lngPosition = 0; 
    //源文件流 
    FileStream sfs = new FileStream(sFile,System.IO.FileMode.Open,System.IO.FileAccess.Read); 
    //二进制文件读取器 
    BinaryReader br = new BinaryReader(sfs); 
    br.BaseStream.Seek(0,System.IO.SeekOrigin.Begin); if(File.Exists(tFile)) 
    File.Delete(tFile); 
    //目标文件流 
    FileStream tfs = new FileStream(tFile,System.IO.FileMode.CreateNew,System.IO.FileAccess.Write); //二进制文件写入器 
    BinaryWriter bw = new BinaryWriter(tfs); 
    //源文件的大小 
    long positionLength = sfs.Length; 
    int k = 10000; 
    //当读到的字节数小于2048,表示已经读到文件流的末尾了。停止读取 
    while(k>=2048) 

    k = br.Read(fb,0,fb.Length); bw.Write(fb); lngPosition += k; 
    //触发事件(关键),参数:1、表示当前共读取了多少,2、表示文件的长度 
    CopyFileEvent(lngPosition,positionLength); 

    tfs.Flush(); 
    bw.Close(); 
    br.Close(); 
    tfs.Close(); 
    sfs.Close(); 


    这个大家看看应该没有什么吧。下面我们就使用这个类来进行文件的拷贝 
    2、按钮的点击事件处理方法: 
    private void button1_Click(object sender, System.EventArgs e) 

    DoWorks dw = new DoWorks(); 
    //这两个公有变量一定要赋值,因为这次主要演示目的,一些判断及异常处理省略了。 
    dw.sFile = sourceFile; 
    dw.tFile = targetFile; 
    //这个是关键,定义事件的处理方法。 
    dw.CopyFileEvent += new AsyncCopyFile.Form1.DoWorks.CopyFileHandler(this.ChgProgress); 
    //定义新线程。 
    Thread t = new Thread(new ThreadStart(dw.CopyFile)); 
    //启动线程 
    t.Start(); 

    这里用到一个this.ChgProgress方法,这个方法就是用来处理界面的显示。 
    3、看一下事件处理方法: 
    private void ChgProgress(long k,long count) 

    this.progressBar1.Maximum = (int)count; 
    this.progressBar1.Minimum = 0; 
    this.progressBar1.Value = (int)k; 
    this.label4.Text = count.ToString(); 
    this.label2.Text = k.ToString(); } 
      

  2.   

    private void CopyFolder(string ASourceFolder,string ATargetFolder)
    {
    try
    {
    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(ASourceFolder);
    System.IO.Directory.CreateDirectory(ATargetFolder+"\\"+di.Name);
    System.IO.Directory[] subDirs = di.GetDirectories();
    foreach(System.IO.DirectoryInfo dir in subDirs)
    {
    CopyFolder(dir.FullName);
    }
    System.IO.FileInfo files = di.GetFiles();
    foreach(System.IO.FileInfo file in files)
    {
    file.CopyTo(ATargetFolder+"\\"+file.Name);
    }
    }
    catch{}
    }
      

  3.   

    我觉得应该先用一个函数后续遍历要拷贝的文件目录,将源目录存放到树型数据结构中,然后在将要被拷贝的硬盘上按照前续遍历刚才的树型结构建好空目录,然后再利用后续遍历去分别拷贝一个个文件就可以了。基本思路是:
       1. 利用后续遍历函数去读取被拷贝目录以及所有子目录,然后将读取到的目录信息(比如文件夹名称,文件夹相对应的路径)按照这种树型结构存储下来。
       2.利用刚才读取的树型目录信息在将要拷贝的硬盘下按照前续遍历生成所有的空目录(这个目录以及子目录应该就和原目录一样了)。
       3.现在你就可以利用后续遍历方法使用File类去一个文件一个文件的拷贝了。(因为他们相对目录动一样了)
      

  4.   

    private void CopyFolder(string ASourceFolder,string ATargetFolder)
    {
    try
    {
    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(ASourceFolder);
    System.IO.Directory.CreateDirectory(ATargetFolder+"\\"+di.Name);
    System.IO.Directory[] subDirs = di.GetDirectories();
    foreach(System.IO.DirectoryInfo dir in subDirs)
    {
    CopyFolder(dir.FullName);
    }
    System.IO.FileInfo files = di.GetFiles();
    foreach(System.IO.FileInfo file in files)
    {
    file.CopyTo(ATargetFolder+"\\"+file.Name);
    }
    }
    catch{}
    }这个方法在原理上是一样,不错。
      

  5.   

    vb的源码有没?c我不熟,看不大明白
      

  6.   

    VB和C#其时差不多的,在.net下
      

  7.   

    就用FSO就可以了,用不着二楼老大那个方法
      

  8.   

    feels30000(船长) ( ) 的方法很好的呀
      

  9.   

    feels30000(船长)的可以的,主要就是递归
      

  10.   

    你到 msdn里面找哈,那你面有方法
      

  11.   

    找了半天        Dim FSO
            FSO = CreateObject("Scripting.FileSystemObject")
            FSO.CopyFolder("c:\rar", "c:\y")最简单