【问题标题】:How to recursively list all the files in a directory in C# and copy all files to another directory如何在C#中递归列出一个目录中的所有文件并将所有文件复制到另一个目录
【发布时间】:2011-08-30 02:26:24
【问题描述】:

我正在尝试编写一个递归读取某个文件夹的 C# 控制台应用程序。 在这些文件夹中有数千张 .jpg 图片

文件夹结构在某些级别非常深,示例如下所示:

Scc-LocalPhoto/testfiles/1997/JAN-JUN 1997/四月 1997/7.4.97 - 11.4.97/FRI11.4.97/

如您所见,文件夹结构相当混乱,但我无法控制。

我的任务是阅读所有文件夹。从图像中提取元数据并存储在 XML 文件中。然后我需要复制相同布局中的所有文件夹并将它们粘贴到一个新文件夹中。

我想我将能够读取所有目录并从图像中提取元数据并将其保存到 xml 文件中。

我不知道该怎么做是复制并粘贴所有文件夹和图像,然后将它们粘贴到保持相同文件夹结构的新目录中。

是否有人知道执行此任务的有效方法,或者是否有任何项目、代码可供我用作起点。

我对 C# 和编写控制台应用程序相当陌生。 感谢您的宝贵时间。

【问题讨论】:

    标签: image indexing directory recursive-query


    【解决方案1】:

    递归解析目录

    static void ParseDirectories(string root)
    {
        ProcessDirectory(new DirectoryInfo(root));
    
        string[] subDirectories = Directory.GetDirectories(root);
    
        // No more directories to explore
        if (subDirectories.Length == 0)
            return;
    
        foreach (string subDirectory in subDirectories)
        {
            ParseDirectories(subDirectory);
        }
    }
    

    处理目录中的文件

    static void ProcessDirectory(DirectoryInfo directory)
    {
        foreach (FileInfo file in directory.EnumerateFiles("*.jpg")
        {
            // record metadata and do other work on each file here
        }
    }
    

    复制目录树

    static void CopyDirectoryTree(DirectoryInfo source, DirectoryInfo dest)
    {
        if (!Directory.Exists(dest.FullName))
            Directory.CreateDirectory(dest.FullName);
    
        bool overwrite = true;
    
        // Copy files
        foreach (FileInfo file in source.EnumerateFiles())
        {
            file.CopyTo(Path.Combine(dest.ToString(), file.Name), overwrite);
        }
    
        // Copy Sub-directories
        foreach (DirectoryInfo subDirectory in source.GetDirectories())
        {
            DirectoryInfo newDirectory = destination.CreateSubdirectory(subDirectory.Name);
            CopyDirectoryTree(subDirectory, newDirectory);
        }
    }
    

    示例使用

    static void Main(string[] args)
    {
        // Process each directory
        string initialDirectory = @"C:\path_to_folder";
        ParseDirectories(initialDirectory);
    
        // Copy directory tree
        string destinationDirectory = @"C:\path_to_new_root_directory";
        CopyDirectoryTree(
            new DirectoryInfo(initialDirectory),
            new DirectoryInfo(destinationDirectory));
    }
    

    希望这会有所帮助!

    【讨论】:

    • @Jason 你运气好吗?
    • 这段代码很好用。谢谢你。我很抱歉无法回复您。感谢您的时间和帮助。非常感谢。
    【解决方案2】:

    我可以建议以下内容,在我看来,这更简单一些

    public static void CopyFolderTree(string sourcePath, string targetPath)
    {
        var sourceDir = new DirectoryInfo(sourcePath);
        var targetDir = new DirectoryInfo(targetPath);
    
        targetDir.Create();
    
        foreach(var file in sourceDir.GetFiles())
            file.CopyTo(Path.Combine(targetPath, file.Name), true);
    
        foreach(var subfolder in sourceDir.GetDirectories())
            CopyFolderTree(subfolder.FullName, Path.Combine(targetPath, subfolder.Name));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多