将包含名称的文件从源复制到目标c#

Posted

技术标签:

【中文标题】将包含名称的文件从源复制到目标c#【英文标题】:Copy files containing a name from source to destination c# 【发布时间】:2020-09-15 16:57:03 【问题描述】:

我有一个包含一系列名称的字符串列表,我想在源目录中找到这些名称并将它们复制到目标。

这是我正在尝试的,但是我将所有源目录复制到目标目录中:

        List<string> ncs = new List<string>();
            ncs = getNames();

        foreach (var file in Directory.GetFiles(sourceDir))
             File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)));


        foreach (var directory in Directory.GetDirectories(sourceDir))
            CopyNCfromTo(directory, Path.Combine(targetDir, Path.GetFileName(directory)));

我也在尝试这种方式:

List<string> ncs = new List<string>();
            ncs = getNames();
            for (int i = 0; i < ncs.Count; i++)
                
                  FileInfo[] filesInDir = hdDirectoryInWhichToSearch.GetFiles(ncs[i].ToString());
                

我想循环列表并查找源文件夹中的每个文件,我该怎么做?

【问题讨论】:

gEtNames() 返回什么? @AndersHyldahl 字符串列表(我想在源目录中找到的文件名) 【参考方案1】:

我假设 ncs 列表只包含名称而不是文件路径或带扩展名的文件名。

     foreach (var file in Directory.GetFiles(sourceDir))
            if (ncs.Contains(Path.GetFileName(file).Split('.').First()))
                File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)));

【讨论】:

出于好奇,您为什么认为没有文件扩展名? 循环遍历名称列表不是更好吗?这样,您只需要遍历名称列表而不是目录的所有文件(只是询问并感谢您的帮助) @Crowcoder 没有关于此的信息,此答案指定包括假设。和 greatWallace 如果有扩展名,是的,我们可以检查 File.Exist() 并在循环名称时复制它。我们有吗? 但是可以有多个文件具有相同的基本名称和不同的扩展名。我永远不会想到文件列表没有扩展名。 是的,但他可以同时复制 a.mp3 和 a.jpeg 吗?【参考方案2】:

发生这种情况是因为 foreach 正在浏览文件夹中包含的文件而不是名称列表,这样,所有文件都会复制到目标文件夹。

foreach(string fileName in ncs)
    string path = sourceDir + fileName;
    bool result = System.IO.File.Exists(path);
    if(result == true)
         string destinationPath = targetDir + fileName;
         System.IO.File.Copy(path,destinationPath);
    

这样你遍历名称列表并检查文件是否存在,如果存在,将文件复制到目标文件夹

【讨论】:

【参考方案3】:

您可以遍历ncs,构建源路径和目标路径,并在文件存在时进行复制。

警告:File.Exists() 可以引入竞争条件。如果您不确定该文件夹中没有其他进程在工作,那么您应该处理 IO 异常。

string sourceDir = "C:\\....";
string targetDir = "C:\\....";

foreach (string filename in ncs)

    string srcFile = Path.Combine(sourceDir, filename);
    string destFile = Path.Combine(targetDir, filename);

    if (File.Exists(srcFile))
    
        File.Copy(srcFile, destFile);   
       

【讨论】:

以上是关于将包含名称的文件从源复制到目标c#的主要内容,如果未能解决你的问题,请参考以下文章

C# 将 zip 条目从一个 zipFile 导出到另一个 zipFile

将具有特定(相同)名称的子文件夹复制到目标

将数据从源配置单元表的多列复制到目标配置单元表的不同行的单列

如何使用在 docker 上运行的 debezium 和 confluent-sink-connector 将所有更改从源数据库复制到目标数据库

用于从源复制数据的 REdshift 复制命令

C#中如何获取程序的当前文件夹名称并将zip文件解压到当前文件夹? [复制]