如何递归列出C#中目录中的所有文件,并将所有文件复制到另一个目录

时间:2011-05-21 05:17:09

标签: image indexing directory recursive-query

我正在尝试编写一个c#控制台应用程序,以递归方式读取某个文件夹。 在这些文件夹中有数千个.jpg图像

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

  

SCC-LocalPhoto / testfiles / 1997 / JAN-JUN   1997 / APRIL 1997 / 7.4.97 -   97年4月11日/ FRI11.4.97 /

正如你所看到的那样,文件夹结构非常混乱,但是我无法控制它。

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

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

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

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

我是C#的新手并编写控制台应用程序。 谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

递归解析目录

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));
}

希望这有帮助!

答案 1 :(得分:0)

我可以建议以下内容,在我看来,这是一个更直接的

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));
}