首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何比较两个不同文件夹中的文件并执行条件复制

如何比较两个不同文件夹中的文件并执行条件复制
EN

Stack Overflow用户
提问于 2014-12-07 01:05:30
回答 2查看 12.5K关注 0票数 4

我需要将所有文件从一个文件夹(Source)复制到另一个文件夹(Destination)。我还需要比较这两个文件夹,并增加一个计数器,如果两个文件夹的内容与名称完全匹配,计数器将停止在100。

我不需要比较每个文件的大小,只需要比较名称。

这是我已经尝试过的,但我并没有像上面所描述的那样得到渴望的结果。

我在这里引用一些资源:http://msdn.microsoft.com/en-us/library/bb546137.aspx

代码语言:javascript
复制
class Program
{
    class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
    {
        public FileCompare() { }

        public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)
        {
            return (f1.Name == f2.Name &&
                    f1.Length == f2.Length);
        }
        public int GetHashCode(System.IO.FileInfo fi)
        {
            string s = String.Format("{0}{1}", fi.Name, fi.Length);
            return s.GetHashCode();
        }
    }

    static void Main(string[] args)
    {

        int i = 1;

        string sourcePath = @"C:\Users\Administrator\Desktop\Source";
        string destinationPath = @"C:\Users\Administrator\Desktop\Dest";

        string fileName = System.IO.Path.GetFileName(sourcePath);

        string source = System.IO.Path.Combine(sourcePath, fileName);
        string destination = System.IO.Path.Combine(destinationPath, fileName);

        System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(sourcePath);
        System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(destinationPath);

        IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.*",
        System.IO.SearchOption.AllDirectories);

        IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.*",
        System.IO.SearchOption.AllDirectories);


        string[] files = System.IO.Directory.GetFiles(sourcePath);

        foreach (string s in files)
        {
            fileName = System.IO.Path.GetFileName(s);
            destination = System.IO.Path.Combine(destinationPath, fileName);
            System.IO.File.Copy(s, destination, true);

            FileCompare myFileCompare = new FileCompare();
            bool areIdentical = list1.SequenceEqual(list2, myFileCompare);

            while (areIdentical != true)
            {
                Console.WriteLine(i++);
            }

        }

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-07 13:43:05

您可以尝试此解决方案,同步两个目录。

代码语言:javascript
复制
class Program
{
    class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
    {
        public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)
        {
            return (f1.Name == f2.Name);
        }
        public int GetHashCode(System.IO.FileInfo fi)
        {
            string s = fi.Name;
            return s.GetHashCode();
        }
    }

    static void Main(string[] args)
    {
        string sourcePath = @"C:\Users\Administrator\Desktop\Source";
        string destinationPath = @"C:\Users\Administrator\Desktop\Dest";

        System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(sourcePath);
        System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(destinationPath);

        IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.*",
        System.IO.SearchOption.AllDirectories);

        IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.*",
        System.IO.SearchOption.AllDirectories);

        bool IsInDestination = false;
        bool IsInSource = false;

        foreach (System.IO.FileInfo s in list1)
        {
            IsInDestination = true;

            foreach (System.IO.FileInfo s2 in list2)
            {
                if (s.Name == s2.Name)
                {
                    IsInDestination = true;
                    break;
                }
                else
                {
                    IsInDestination = false;
                }
            }

            if (!IsInDestination)
            {
                System.IO.File.Copy(s.FullName, System.IO.Path.Combine(destinationPath, s.Name), true);
            }
        }

        list1 = dir1.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

        list2 = dir2.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

        bool areIdentical = list1.SequenceEqual(list2, new FileCompare());

        if (!areIdentical)
        {
            foreach (System.IO.FileInfo s in list2)
            {
                IsInSource = true;

                foreach (System.IO.FileInfo s2 in list1)
                {
                    if (s.Name == s2.Name)
                    {
                        IsInSource = true;
                        break;
                    }
                    else
                    {
                        IsInSource = false;
                    }
                }

                if (!IsInSource)
                {
                    System.IO.File.Copy(s.FullName, System.IO.Path.Combine(sourcePath, s.Name), true);
                }
            }
        }

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
票数 9
EN

Stack Overflow用户

发布于 2020-08-29 04:44:39

对于一个副本,从源到目的地的每一件事,即使是在目标中丢失的任何特定文件,它都会复制。需要在删除中修改索引。

代码语言:javascript
复制
//if (s.FullName.Remove(0, 24) == s2.FullName.Remove(0, 24))
//my path is D:\TestProgram\ which contain two folders Prod_bin and Jul-2020
//so I have trim for if there are two files present on two locations so it will compare //name as well as the file location.

//file name D:\TestProgram\Prod_BIN\ABC\bin\sanyog.css
//D:\TestProgram\JUl-2020\ABC\bin\sanyog.css

//after remove it will be like ABC\bin\sanyog.exe.

//need to verify the index and try to implement it.

// and also need to replace your source and destination folder name like 
// mine string destfilePath = s.FullName.Replace("Prod_BIN", "JUL-2020");


    class Program
    {
        class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileSystemInfo>
        {
            public bool Equals(System.IO.FileSystemInfo f1, System.IO.FileSystemInfo f2)
            {
                return (f1.Name == f2.Name);
            }
            public int GetHashCode(System.IO.FileSystemInfo fi)
            {
                string s = fi.Name;
                return s.GetHashCode();
            }
        }

        static void Main(string[] args)
        {

            int i = 0;

            string sourcePath = @"D:\TestProgram\Prod_BIN";
            string destinationPath = @"D:\TestProgram\JUL-2020";

            System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(sourcePath);
            System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(destinationPath);

            IEnumerable<System.IO.FileSystemInfo> list1 = dir1.GetFileSystemInfos("*.*",
            System.IO.SearchOption.AllDirectories);

            IEnumerable<System.IO.FileSystemInfo> list2 = dir2.GetFileSystemInfos("*.*",
            System.IO.SearchOption.AllDirectories);

            bool IsInDestination = false;

            foreach (System.IO.FileSystemInfo s in list1)
            {
                IsInDestination = true;

                foreach (System.IO.FileSystemInfo s2 in list2)
                {
                    if (s.Name == s2.Name)
                    {
                        if (s.FullName.Remove(0, 24) == s2.FullName.Remove(0, 24))
                        {
                            IsInDestination = true;
                            break;
                        }
                    }
                    else
                    {
                        IsInDestination = false;
                    }
                }
                string destfilePath = s.FullName.Replace("Prod_BIN", "JUL-2020");
                if (!IsInDestination)
                {
                    i = i + 1;
                    if (s.Attributes.Equals(System.IO.FileAttributes.Directory))
                    {
                        Directory.CreateDirectory(destfilePath);
                    }
                    else
                    {
                        if (!s.Attributes.Equals(System.IO.FileAttributes.Hidden | System.IO.FileAttributes.Directory))
                            System.IO.File.Copy(s.FullName, System.IO.Path.Combine(Directory.GetParent(destfilePath).FullName, s.Name), true);
                    }
                }
            }
            Console.WriteLine("Total copied files : {0} Press any key to exit.", i);
            Console.ReadKey();

        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27338444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档