【问题标题】:How to make a method recursive?如何使方法递归?
【发布时间】:2014-10-19 11:01:03
【问题描述】:

在过去的几天里,我创建了一种方法,该方法获取文件夹中的文件和第一个子文件夹中的文件,但不在这些子文件夹的子文件夹中。

为了更好地解释它:

这是文件夹:

//Folder1
//├file1.txt
//├subfolder1
//|├file2.txt
//|└subfolder3
//| └file3.txt
//└subfolder2
// └subfolder4
//  └subfolder5
//   └file4.txt

这就是我得到的:

//Folder1
//├file1.txt
//└subfolder1
// └file2.txt

这就是我将它放在我复制它的文件夹中的方式:

//Folder2
//├file1.txt
//├subfolder1___file2.txt
//├subfolder1___subfolder3___file3.txt
//└subfolder2___subfolder4___subfolder5___file4.txt

我就是这样:

//Folder2
//├file1.txt
//└subfolder1___file2.txt

(为了更好地理解这些结构,请阅读代码)

当前代码:

private void GetFiles(string filePath)
{
    //filepath = "C:\Example\folder1"
    string[] installfiles = Directory.GetFiles(Path.GetDirectoryName(filePath));
    string appdatafolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    string[] SelectedFiles;

    foreach (string file in installfiles)
    {
        string fileName = Path.GetFileName(file);

        if (!Directory.Exists(appdatafolder + "\\temp"))
        {
            Directory.CreateDirectory(appdatafolder + "\\temp");
        }
        if (!File.Exists(sourcefoldervalueLabel.Text + "\\" + fileName))
        {
            File.Copy(filePath + filename, appdatafolder + "\\temp\\" + fileName, true);
        }
    }

//here I would make it recursive.

    if (Directory.GetDirectories(Path.GetDirectoryName(filePath)).Length >= 1)
    {
        string[] subdirectoryies = Directory.GetDirectories(filePath);
        foreach (string directory in subdirectoryies)
        {
            string[] SubFiles = Directory.GetFiles(directory);
            string directoryname = Path.GetFileName(directory);

            foreach (string file in SubFiles)
            {
                string filename = Path.GetFileName(file);
                if (!File.Exists(sourcefoldervalueLabel.Text + "\\" + directoryname + "\\" + filename))
                {
                     File.Copy(file, appdatafolder + "\\temp\\" + directoryname + "___" + filename, true); // here I copy it into Folder2 but instead of creating subfolders I add "___" between the subfolder-name and the file-name
                }
            }
        }
    }
}

所以如果我让它在我设置的点递归(看代码),我可以得到每个文件夹中的文件(我想否则告诉我)。

所以我的问题是:

如果当前文件夹中有子文件夹,如何每次都重复“标记”代码?

我希望这个问题是可以理解的(否则我会解释它)。

一如既往,您可以尽一切可能纠正我:)。

祝你有美好的一天,

温柔。

【问题讨论】:

  • 你可以在这篇文章中找到一些帮助:stackoverflow.com/a/19067063/2259589
  • 这与您尝试做的类似:stackoverflow.com/a/25360943/451540
  • @Millas 如果您的意思是链接中投票最多的评论...我想我说过什么时候应该停止以避免invinitive loop
  • @thumbmunkeys 我认为每次都需要保存子目录名称以将其添加到文件名中,所以我不知道如何......一些想法?
  • 为什么不赞成我尝试学习;)你们可以纠正我而不是反对;)

标签: c# directory subdirectory


【解决方案1】:

这种情况的完美代码是右树算法。

【讨论】:

  • 这个“右树算法”是什么?
  • 它是一种递归算法。您可以创建一个您将作为节点传递的节点类型的自定义类,我有一个定制的但它是二叉树算法。只需稍加改动即可使用它。
  • 我很想得到你的代码,这样我就可以改变它,所以我可以使用它:)(我不会滥用它:))
  • 此代码基于控制台。目前它正在 binaraytreenode 类中保存一个字符,您的变量和数据类型将像目录位置一样存储。
  • 我知道你想试试。但是代码是工具很长的评论。
【解决方案2】:

好的,我在查找一些递归编程后解决了它

最终代码:

private void GetFilesinDirectory(string directory,string targetdirectory)
{
    string [] directories = Directory.GetDirectories(directory);
    if(directories.Length >= 1)
    {
        for (int i = 0; i < directories.Length; i++)
        {
            GetFilesinDirectory(directories[i], targetdirectory);
        }
    }
    string[] files = Directory.GetFiles(directory);
    if (files.Length >= 1)
    {
        for (int i = 0; i < files.Length; i++)
        {
            string filename = Path.GetFileName(files[i]);
            string filenamewithoutdeploy = filename.Replace(".deploy", string.Empty);

            string directoryunderscoreName = directory.Replace(InstallfoldervalueLabel.Text + "\\Appfiles\\", String.Empty)
                                                .Replace("\\","___");
            string directoryname = directory.Replace(InstallfoldervalueLabel.Text + "\\Appfiles\\", String.Empty);

            if (!File.Exists(sourcefoldervalueLabel.Text + "\\" + directoryname + "\\" + filenamewithoutdeploy))
            {
                File.Copy(directory + "\\" + filename, targetdirectory + directoryunderscoreName + "___" + filename, true);
            }
        }
    }
}

我很想得到一些更正,建议:)

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2016-08-05
    相关资源
    最近更新 更多