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