我有一个主要的文件列表Filelist
。主列表包含完整文件路径,还有第二个列表copylist
它通过从目录中获取内容来实现。我需要替换Filelist
中的文件名与临时文件夹中的文件名相匹配,因此我使用了以下代码。
Filelist = new List<string>();
//Code to Populate File List from openfiledialog
try
{
copylist = Directory.GetFiles(temppath + @"\mydir\");
List<string> tempfiles = new List<string>(Filelist);
int x = 0;
foreach (string file in tempfiles)
{
for (int i = 0; i < copylist .Length; i++)
{
if (Path.GetFileName(file) == Path.GetFileName(copylist [i]))
{
MessageBox.Show("Removed: " + file + " \ninserted:" + copylist [i]);
Filelist.RemoveAt(x);
Filelist.Insert(x,copylist [i]);
}
x++;
}
}
}
catch (Exception)
{
}
我测试了4个文件...手动检查时匹配的文件名(即:临时文件夹和文件列表中的文件名相同)。等级检查即:Path.GetFileName(file) == Path.GetFileName(copylist [i])
仅满足2文件,最后在Filelist
中只替换了1个文件,即使临时文件夹中存在所有4个文件。
我做错了什么。请指教。
答案 0 :(得分:1)
您的计划的逻辑依赖于以下事实:tempfiles
和Filelist
中的职位相关,而x
对应file
中tempfiles
的职位}}。为了实现此目的,您需要在break
内添加if
,并将x++
移至外部循环:
foreach (string file in tempfiles) {
for (int i = 0; i < copylist .Length; i++) {
if (Path.GetFileName(file) == Path.GetFileName(copylist [i])) {
MessageBox.Show($"Removed: {file}\ninserted:{copylist [i])}";
Filelist.RemoveAt(x);
Filelist.Insert(x,copylist[i]);
break; // << Added
}
}
x++; // << Moved
}