在文件夹中找到匹配的文件(不包括文件扩展名)并将其移动到新文件夹中

时间:2019-03-18 02:11:07

标签: c# winforms

我有一个包含Word和PDF文件的文件目录。目录中的某些Word文件与同一目录中的PDF文件具有相同的文件名(负扩展名)。我已经安装了一个简单的C#winforms应用程序以遍历文件并移动与PDF文档同名的Word文档。到目前为止,这就是我所拥有的。我不确定为什么这行不通:

        string[] filesWORD = Directory.GetFiles(@"c:\test\", "*.docx");
        List<string> resultFiles = new List<string>();
        foreach (var file in filesWORD)
        {
            var finalfile = file.Substring(0, file.LastIndexOf(".")); // removes everything after period in name.
            resultFiles.Add(finalfile);
            listBox1.DataSource = resultFiles.Distinct().ToList(); // placing the Word files in listBox1
        }

        string[] filesPDF = Directory.GetFiles(@"c:\test\", "*.pdf");
        List<string> resultFilesPDF = new List<string>();
        foreach (var file in filesPDF)
        {
            var finalfile = file.Substring(0, file.LastIndexOf(".")); 
            resultFilesPDF.Add(finalfile);
            listBox2.DataSource = resultFilesPDF.Distinct().ToList(); // placing the PDF files in listBox2
        }            

        for (int i = 0; i < listBox1.Items.Count; i++)
        {
            //IF the WORD files in listBox1 match the PDF files in listBox2 -- move them to a new folder.
            foreach (string files in listBox1.Items)
            {
                if (listBox1.Items == listBox2.Items)
                {
                    //Get Filename                    
                    var filename = Path.GetFileName(files + ".docx");
                    //Move Files
                    File.Move(files + ".docx", @"c:\test2\" + "\\" + filename);
                }                   

            }
        }

1 个答案:

答案 0 :(得分:2)

最终的for循环是问题所在,您可以尝试一下(需要为您的案例添加列表框),比较的是错误的东西,也不需要外部for循环。

foreach (var pdfFile in resultFilesPDF)
        {
            foreach (var wordFile in resultFiles)
            {
                if (wordFile == pdfFile)
                {
                    //Get Filename                    
                    var filename = System.IO.Path.GetFileName(wordFile + ".docx");
                    //Move Files
                    File.Move(wordFile + ".docx", @"c:\test2\" + "\\" + filename);
                }
            }
        }

使用Linq可以做到,请注意,如果尝试多次移动同一文件,则Move方法可能会崩溃。

   var sameNames = resultFiles.SelectMany(w => resultFilesPDF.Where(p => p == w));
    sameNames.ToList().ForEach(file =>
    {
        File.Move(file + ".docx", @"c:\test2\" + "\\" + System.IO.Path.GetFileName(file + ".docx"));
    });