首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在复制文件和目录时防止递归?

如何在复制文件和目录时防止递归?
EN

Stack Overflow用户
提问于 2021-01-20 03:11:59
回答 2查看 64关注 0票数 0

我遇到了复制文件/目录的问题。几乎挣扎了一整天。我必须从root dir文件及其包含文件和子目录的dires进行复制。实际上,我做了点东西。但是,每次我运行时都会出现堆栈溢出错误。

代码语言:javascript
运行
复制
abstract class SystemOperations {
    public virtual void SearchFiles() { }
    public virtual void SearchDirectories() { }

    public abstract void CreateDirectory(string DIR);
    public abstract void CloneContent(string DIR);
    public abstract void CreateJSON(string DIR);

    public void ExecuteCopying(string DIR) {
        CreateDirectory(DIR);
        CloneContent(DIR);
        CreateJSON(DIR);
    }
}

class FileOperations : SystemOperations {
    DirectoryInfo _MainPath;
    public DirectoryInfo MainPath {
        get { return _MainPath; }
        set { _MainPath = value; }
    }

    public FileOperations(DirectoryInfo MainPath) {
        this.MainPath = MainPath;
    }

    #region Unnecessary for current task
    public override void SearchFiles() {
        string path = "";
        FileInfo[] files = MainPath.GetFiles();

        foreach (FileInfo file in files) {
            path = file.Name;
        }
    }

    public override void SearchDirectories() {
        string path = "";
        DirectoryInfo[] directories = MainPath.GetDirectories();

        foreach (DirectoryInfo directory in directories) {
            path = directory.Name;
        }
    }
    #endregion

    public override void CreateDirectory(string DIR) {
        string newFolder = Path.Combine(MainPath + "", DIR);
        Directory.CreateDirectory(newFolder);
    }

    public override void CloneContent(string DIR) {

        foreach (var directory in Directory.GetDirectories(MainPath + "")) {
            string dir = Path.GetFileName(directory);

            CloneContent(Path.Combine(MainPath + "", dir));
        }

        foreach (var file in Directory.GetFiles(MainPath + "")) {
            File.Copy(file, Path.Combine(MainPath + "", Path.GetFileName(file)), true);
        }
    }

    public override void CreateJSON(string DIR) {
        if (!Directory.Exists(DIR)) {
            var asd = new DirectoryInfo(DIR);
        }
    }
}

class Program {
    static void Main() {
        SystemOperations task = new FileOperations(new DirectoryInfo(@"D:\\LAK"));
        task.ExecuteCopying("COPY");
    }
}

因此,函数CloneContent必须复制到每个目录/子目录文件中。但是它的递归函数,正如我在上面写的,我跑到了错误。不知道怎么解决这个问题。谢谢!

EN

Stack Overflow用户

发布于 2021-01-20 06:29:04

要使一个递归方法工作,它必须至少有一个“退出”条件--在这个点上,它完成了它的工作,可以展开堆栈。在我们的例子中,它是在没有更多的目录或文件可以从源复制到目标的时候。

编写此方法的一种方式是接受源目录和目标目录,然后它可以递归地为每个子目录调用自身:

代码语言:javascript
运行
复制
public static void CloneContent(string sourceDir, string destDir)
{
    // If the source directory doesn't exist, return
    if (!Directory.Exists(sourceDir)) return;
    
    // Create destination if needed
    Directory.CreateDirectory(destDir);

    // Copy files from this directory to the new path
    foreach (string file in Directory.GetFiles(sourceDir))
    {
        File.Copy(file, Path.Combine(destDir, Path.GetFileName(file)));
    }

    // Recursively call this method for each sub directory
    foreach (string subDir in Directory.GetDirectories(sourceDir))
    {
        string dirName = Path.GetFileName(subDir);
        string newSource = Path.Combine(sourceDir, dirName);
        string newDest = Path.Combine(destDir, dirName);

        CloneContent(newSource, newDest);
    }
}
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65797972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档