如何在将文件复制到另一个目录时比较文件?

时间:2015-07-24 12:58:47

标签: c# copying file-copying

我目前正在使用以下代码段浏览一个非常大的目录中的数百万个文件,然后将我需要的文件复制到另一个工作目录中。 sNosint[],它包含一些整数。我检查文件名是否包含其中一个整数,如果是,则将其复制到我的本地目录中。

string[] allFiles = System.IO.Directory.GetFiles(@"C:\ExampleFolder");
            foreach (string file in allFiles)
            {
                for (int i = 0; i < sNos.Count(); i++) 
                { 
                    if (file.Contains(sNos[i].ToString()))
                    {
                        File.Copy(file, "C:\\newFolder\\" + file.Substring(file.Length - 25), true);
                    }
                }
            }

现在,具体而言..文件名的格式为XXXXXX_XX_XX_XX_XXX_XXX表示整数。文件名中的前6个数字是我尝试与我的int数组中的值匹配的数字。问题是,可能存在名称如下的文件:

123456_33_42_56_234_44 (Size: 1 MB)
123456_33_46_34_992_23 (Size: 2 MB)

现在,由于两个文件都匹配&#34; 123456&#34;在我的int数组中,两者都将被复制。但是,我只想在每次与多个文件匹配时复制较大的文件。可以匹配2个文件,可能是3个甚至更多。我该怎么做呢?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

var stringIds = sNos.Select(id=>id.ToString()).ToList();

// get the matching files and group them by id
var filesById = (from file in allFiles
                 let id = stringIds.FirstOrDefault(n => file.StartsWith(n))
                 where id != null
                 select new {file, id}).ToLookup(anon=>anon.id, anon.file);

// within each group, get the biggest file
var onlyBiggestById = filesById.ToDictionary(
                          fileGroup => fileGroup.key, 
                          fileGroup => fileGroup.Select(file => new {file, length = new System.IO.FileInfo(file).Length})
                                                .OrderByDescending(anon=>anon.Length)
                                                .Select(anon=>anon.file)
                                                .First())

// Actually copy the files 
onlyBiggestById.Values.ToList()
    .ForEach(file => File.Copy(file, "C:\\newFolder\\" + file.Substring(file.Length - 25), true));

答案 1 :(得分:0)

借助 FileInfo 获取文件的大小,并根据您的要求应用条件。

// Create new FileInfo object and get the Length.
    FileInfo f = new FileInfo(file);
    long s1 = f.Length;