簡體   English   中英

如何防止遞歸復制文件和目錄?

[英]How to prevent recursive in copying files and dirs?

我遇到了復制文件/目錄的問題。 幾乎整天都在掙扎。 我必須從根目錄文件及其帶有文件和子目錄的目錄復制。 事實上,我已經做了一些事情。 但是,每次我在stackoverflow錯誤中運行。

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

因此,function CloneContent 必須復制到每個 dir/subdirs 文件中。 但是它的遞歸函數,正如我上面寫的,我遇到了錯誤。 而且不知道如何解決這個問題。 感謝你!

您嘗試確定接下來需要搜索哪個目錄的方式存在某種問題,在我看來,使用 MainPath 是錯誤的。

就我個人而言,我也總是更喜歡使用輔助停止條件來避免 StackOverflowException,就像我在下面使用的 maxrunCount 一樣。

如果您想要遞歸目錄查找,您應該將代碼重寫為類似

void Main()
{
    string MainPath = "D:\\LAK";
    // unless your directory is actually named \LAK:) you should use either @"D:\LAK" or "d:\\LAK"
    CloneContent(MainPath,1000);
}

public void CloneContent(string directoryToSearch, int maxrunCount)
{
    if(maxrunCount==0)
        return;
        
    System.Diagnostics.Debug.Print(directoryToSearch);
    string[] directories = null;
    try
    {
        directories = Directory.GetDirectories(directoryToSearch);
    }
    catch(UnauthorizedAccessException ex) {
        System.Diagnostics.Debug.Print($"No access to dir {directoryToSearch}");
        directories = new string[0];
    }
    
    // ensure you have access to the current directoryToSearch
    foreach (var directory in directories)
    {
        CloneContent(directory,--maxrunCount);
    }
    System.Diagnostics.Debug.Print($"cloning {directoryToSearch}");
    // .... do the actual cloning here, 
    // you will end up here when there are no more subdirectories on the current branch
}

要使遞歸方法起作用,它必須至少具有一個“退出”條件——它完成工作並可以展開堆棧的點。 在我們的例子中,當沒有更多的目錄或文件可以從源復制到目標時。

編寫此方法的一種方法是獲取源目錄和目標目錄,然后它可以遞歸地為每個子目錄調用自身:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM