替换字符串列表中的匹配文件名

时间:2016-05-01 08:29:07

标签: c# .net string linq list

我有一个主要的文件列表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个文件。

我做错了什么。请指教。

1 个答案:

答案 0 :(得分:1)

您的计划的逻辑依赖于以下事实:tempfilesFilelist中的职位相关,而x对应filetempfiles的职位}}。为了实现此目的,您需要在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
}