首页 > 解决方案 > 在文件夹中查找匹配的文件(减去文件扩展名)并将它们移动到新文件夹

问题描述

我有一个包含 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);
                }                   

            }
        }

标签: c#winforms

解决方案


最后的 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"));
    });

推荐阅读