网站一个目录,要定时备份
文件比较大,想实现增量修改备份
我写了一个,但是有些问题如下        //copyPath 需要备份的文件,toPath目标
        public static void Copy(string copyPath, string toPath)
        {
            if (toPath[toPath.Length - 1] != Path.DirectorySeparatorChar)
            {
                toPath += Path.DirectorySeparatorChar;
            }
            if (!Directory.Exists(toPath))//
            {
                Directory.CreateDirectory(toPath);
            }
            string[] fileList = Directory.GetFileSystemEntries(copyPath);
            foreach (string file in fileList)//
            {
                string[] copyfiles = Directory.GetFiles(file);//
                foreach (string tofile in copyfiles)//
                {
                    //这里,应该是,当前要复制的文件,是否在要复制大文件中
                    //Exists是判断目录的,那个方法可以判断文件
                    //就是D:\Object\a.txt,是否在D:\Copy\a.txt
                    if (!Directory.Exists(tofile))
                    {
                        //没有就复制出来
                        //这里文件结构有问题
                        //我想得到的是,
                        //D:\Object\a.txt,copyTO D:\Copy\a.txt
                        //而不是
                        //D:\Object\a.txt,copyTO D:\Copy\Object\a.txt
                        File.Copy(tofile, toPath + Path.GetFileName(tofile), true);
                    }
                    else
                    {
                        //文件存在要对比时间,这样写不好吧!文件目录结构比较多
                        var d = new FileInfo(tofile).LastWriteTime;
                        var dt = new FileInfo(toPath+tofile).LastWriteTime;
                        if(d>dt)
                        {
                            File.Copy(tofile, toPath + Path.GetFileName(tofile), true);
                        }
                    }
                }
            }
        }

解决方案 »

  1.   


            //srcPath原始路径
            //aimPath目标文件夹
            public static void CopyDir(string srcPath, string aimPath)
            {
                try
                {
                  // 检查目标目录是否以目录分割字符结束如果不是则添加之
                    if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar)
                        aimPath += Path.DirectorySeparatorChar;
                  // 判断目标目录是否存在如果不存在则新建之
                    if (!Directory.Exists(aimPath))
                        Directory.CreateDirectory(aimPath);
                  // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组
                    //如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法
                    //string[] fileList = Directory.GetFiles(srcPath);
                    string[] fileList = Directory.GetFileSystemEntries(srcPath);
                  //遍历所有的文件和目录
                    foreach (string file in fileList)
                    {
                     //先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
                        if (Directory.Exists(file))
                            CopyDir(file, aimPath + Path.GetFileName(file));
                     //否则直接Copy文件
                        else
                            File.Copy(file, aimPath + Path.GetFileName(file), true);
                    }
                }
                catch (Exception ee)
                {
                    throw new Exception(ee.ToString());
                }
            }
      

  2.   

    public static void CreateDirectory(this string dirPath)
            {
                if (!Directory.Exists(dirPath))
                {
                    Directory.CreateDirectory(dirPath);
                }
            }        public enum CopyType
            { 
                File,
                Directory
            }        /// <summary>
            /// 将fromDir文件夹下的所有文件及文件夹Copy至toDir下
            /// </summary>
            /// <param name="fromDir">来源(物理路径)</param>
            /// <param name="toDir">目的地(物理路径)</param>
            /// <param name="copyType">要复制的类型(注意:可以指定只复制文件夹结构,但指定复制文件则必定复制文件夹结构)</param>
            /// <param name="noNeedCopyRules">不需要复制的规则(名字正则)</param>
            /// <param name="isNoNeedCopy">是否存在不需要复制的文件或文件夹,true为不需要复制</param>
            public static void Copy(string fromDir, string toDir, CopyType copyType, string noNeedCopyRules,bool isNoNeedCopy)
            {
                if (Directory.Exists(fromDir))
                {
                    string[] childDir = Directory.GetDirectories(fromDir);
                    if (childDir != null && childDir.Length > 0)
                    {
                        foreach (string tS in childDir)
                        {
                            if (isNoNeedCopy && System.Text.RegularExpressions.Regex.IsMatch(tS, noNeedCopyRules))
                            {
                                continue;
                            }                        Copy(tS, toDir + tS.Substring(fromDir.Length), copyType, noNeedCopyRules, isNoNeedCopy);
                        }
                    }
                    else
                    {
                        toDir.CreateDirectory();
                    }                if (copyType == CopyType.File)
                    {
                        string[] fi = Directory.GetFiles(fromDir);
                        if (fi != null && fi.Length > 0)
                        {
                            foreach (string f in fi)
                            {
                                if (isNoNeedCopy && System.Text.RegularExpressions.Regex.IsMatch(f, noNeedCopyRules))
                                {
                                    continue;
                                }                            string toFilePath = toDir + f.Substring(fromDir.Length);                            if (File.Exists(toFilePath))
                                {
                                    File.Delete(toFilePath);
                                }                            File.Copy(f, toFilePath);
                            }
                        }
                    }
                }
            }
      

  3.   

    获取tofile的文件名(不包括路径);(用lastindex("\")取)
    再赋值路径
    最后判断(路径+文件名)是否存在,不存在就复制;反之覆盖。