在 C# 中复制除某些文件夹和文件之外的所有文件夹

Wai-Chun Ang

我想将所有文件夹和文件从“源”复制到“目标”,除了某个目录(systemdir)。

这个方法我参考了:C# Searching for files and folders except in某些文件夹

但我发现我的结果有一些问题:

在源目录中如果有“Intel”或任何以“Intel”开头的文件夹,例如“Intel123”,将一起排除。所以我希望完全复制我提到的文件夹,而不是全部包含目录名称。

如果有其他方法欢迎分享。

以下是我的代码:

using System;
using System.IO;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string serialNum = "MS001";
            string userName = Environment.UserName;
            string sourcecpath = "C:\\Users\\" + userName + "\\Desktop\\Dummy\\Local C";
            string targetcpath = "C:\\Users\\" + userName + "\\Desktop\\Dummy\\Desktop\\" + serialNum + "\\Local C";
            copy(sourcecpath, targetcpath);
        }

    public static void copy(string source, string target)
    {

        string[] systemdir = new string[] {  "Error", "Intel", "PerfLogs", "Program Files", "Users", "Windows" };

        for (var i = 0; i < systemdir.Length; i++)
        {
            systemdir[i] = source + "\\" + systemdir[i];
        }

        //Now Create all of the directories
        foreach (string dirPath in Directory.GetDirectories(source, "*", SearchOption.AllDirectories).Where(d => systemdir.All(e => !d.StartsWith(e))))
        {
            Console.WriteLine(dirPath);
            if (System.IO.Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath.Replace(source, target));
            }

        }

        //Copy all the files & Replaces any files with the same name
        foreach (string newPath in Directory.GetFiles(source, "*.*", SearchOption.AllDirectories))
        {
            if (System.IO.Directory.Exists(Path.GetDirectoryName(newPath.Replace(source, target))))
            {

                if (System.IO.File.Exists(newPath))
                {
                    File.Copy(newPath, newPath.Replace(source, target), true);
                    // Use a try block to catch IOExceptions, to
                    // handle the case of the file already being
                    // opened by another process.
                    try
                    {
                        System.IO.File.Delete(newPath);
                    }
                    catch (System.IO.IOException e)
                    {
                        Console.WriteLine(e.Message);
                        return;
                    }
                }
            }
        }
    }
}

}

由(Simply Ged)建议的编辑:

using System;
using System.IO;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string serialNum = "MS001";
            string userName = Environment.UserName;
            string sourcecpath = "C:\\Users\\" + userName + "\\Desktop\\Dummy\\Local C";
            string targetcpath = "C:\\Users\\" + userName + "\\Desktop\\Dummy\\Desktop\\" + serialNum + "\\Local C";
            copy(sourcecpath, targetcpath);
        }

    public static void copy(string source, string target)
    {

        string[] systemdir = new string[] {  "Error", "Intel", "PerfLogs", "Program Files", "Users", "Windows" };

        for (var i = 0; i < systemdir.Length; i++)
        {
            systemdir[i] = source + "\\" + systemdir[i] + "\\";
        }

        //Now Create all of the directories
        var directoryList = Directory.GetDirectories(source, "*", SearchOption.AllDirectories).Where(d => !systemdir.Any(e => d.StartsWith(e)));

        foreach (string dirPath in directoryList)
        {
            Console.WriteLine(dirPath);
            if (System.IO.Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath.Replace(source, target));
            }

        }

        //Copy all the files & Replaces any files with the same name
        foreach (var directory in directoryList)
        {
            foreach (string newPath in Directory.GetFiles(source, "*.*", SearchOption.AllDirectories))
            {
                if (System.IO.Directory.Exists(Path.GetDirectoryName(newPath.Replace(source, target))))
                {

                    if (System.IO.File.Exists(newPath))
                    {
                        File.Copy(newPath, newPath.Replace(source, target), true);
                        // Use a try block to catch IOExceptions, to
                        // handle the case of the file already being
                        // opened by another process.
                        try
                        {
                            System.IO.File.Delete(newPath);
                        }
                        catch (System.IO.IOException e)
                        {
                            Console.WriteLine(e.Message);
                            return;
                        }
                    }
                }
            }
        }
    }
}

}

Wai-Chun Ang

我发现需要添加“\\”的 dirPath 以便它能够与 systemdir 数组进行比较:

using System;
using System.IO;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string serialNum = "MS001";
            string userName = Environment.UserName;
            string sourcecpath = "C:\\Users\\" + userName + "\\Desktop\\Dummy\\Local C";
            string targetcpath = "C:\\Users\\" + userName + "\\Desktop\\Dummy\\Desktop\\" + serialNum + "\\Local C";
            copy(sourcecpath, targetcpath);
        }

    public static void copy(string source, string target)
    {

        string[] systemdir = new string[] { "Error", "Intel", "PerfLogs", "Program Files", "Users", "Windows" };

        for (var i = 0; i < systemdir.Length; i++)
        {
            systemdir[i] = source + "\\" + systemdir[i] + "\\";
            Console.WriteLine(systemdir[i]);
        }

        //Now Create all of the directories
        foreach (string dirPath in Directory.GetDirectories(source, "*", SearchOption.AllDirectories))
        {
            string dirPath2 = dirPath + "\\";
            if (!systemdir.Any(dirPath2.Contains))
            {
                if (System.IO.Directory.Exists(dirPath))
                {
                    Directory.CreateDirectory(dirPath.Replace(source, target));
                }
            }

        }

        //Copy all the files & Replaces any files with the same name

        foreach (string newPath in Directory.GetFiles(source, "*.*", SearchOption.AllDirectories))
        {
            if (System.IO.Directory.Exists(Path.GetDirectoryName(newPath.Replace(source, target))))
            {

                if (System.IO.File.Exists(newPath))
                {
                    File.Copy(newPath, newPath.Replace(source, target), true);
                    // Use a try block to catch IOExceptions, to
                    // handle the case of the file already being
                    // opened by another process.
                    try
                    {
                        System.IO.File.Delete(newPath);
                    }
                    catch (System.IO.IOException e)
                    {
                        Console.WriteLine(e.Message);
                        return;
                    }
                }
            }
        }
    }
}

感谢Simply Ged 的帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C#Sharepoint.Client-返回给定子文件夹中的所有文件和文件夹

C#搜索文件和文件夹(某些文件夹除外)

列出C中给定路径中的文件夹,子文件夹和文件(Windows)

按大小C#对所有文件和文件夹进行排序

C# sharepoint 循环遍历文件夹和所有子文件夹中的所有文件

C#文件夹创建不创建所有文件夹,而仅在某些计算机上

如何删除所有文件/文件夹,但将根文件夹保留在C#中

我可以创建SAS URL来访问C#中Azure文件共享(即不是Blob)中目录的所有文件和文件夹吗?

遍历文件夹中的文件(C ++)

C#返回位于其中具有文件夹的目录中的所有文件

使用 C# 在线列出 Sharepoint 上文件夹中的所有文件

Qt C++:包括项目文件夹中的所有库文件

如何使用C读取文件夹中的所有文件

如何包含文件夹中的所有源文件?(C ++,MS VS 2013)

如何从C#中的文件夹中选择所有xml文件并解析它们

编译C时如何链接文件夹中的所有目标文件?

在 C++ 中读取所有文件由 . 文件夹

C ++控制台中的星号列出了文件夹中的所有文件,为什么?

获取tar -C指定文件夹中的所有文件

如何将文件从特定文件夹复制到C#中的共享文件夹?

构建C ++应用程序(目录和文件夹)

C#在Listview中显示文件和文件夹图标

验证在C ++中创建多个文件夹和文件的正确方法

C ++中的递归文件夹扫描

列出目录C +中的文件夹

如何删除除某些文件夹之外的所有文件夹

在Qt C ++中列出带有Qtreewidget的文件夹

尝试删除文件夹中的所有文件,例如C#中的2个选定文件

使用Win32 C ++复制CD Rom中的所有文件并将其保存在其他位置的文件夹中