我坐着一个我似乎无法完成的脑筋急转弯。我正在尝试创建一个特定的文件夹结构。这里解释了结构:
在指定的根文件夹中,应用程序应创建10个文件夹,“0” - “10”。在其中的每一个中,应该再次是文件夹'0' - '10'等。这必须继续用户定义的级别。
使用for循环,到目前为止我已经设法得到了这个,但可以想象一个递归函数看起来不那么混乱,但同时融化我的大脑试图找出它D:
static void Main(string[] args)
{
string basePath = Path.Combine(Environment.CurrentDirectory, "Lib");
for (int a = 0; a < 10; a++)
{
CreateFolders(basePath);
basePath = Path.Combine(basePath, a.ToString());
for (int b = 0; b < 10; b++)
{
CreateFolders(basePath);
basePath = Path.Combine(basePath, b.ToString());
for (int c = 0; c < 10; c++)
{
CreateFolders(basePath);
basePath = Path.Combine(basePath, c.ToString());
for (int d = 0; d < 10; d++)
{
CreateFolders(basePath);
basePath = Path.Combine(basePath, d.ToString());
basePath = Helpers.DirMoveBack(basePath);
}
basePath = Helpers.DirMoveBack(basePath);
}
basePath = Helpers.DirMoveBack(basePath);
}
basePath = Helpers.DirMoveBack(basePath);
}
Console.ReadLine();
}
// Creates folders '0' - '9' in the specified path
static void CreateFolders(string path)
{
for (int a = 0; a < 10; a++)
{
Directory.CreateDirectory(string.Format("{0}\\{1}", path, a));
Console.WriteLine(string.Format("{0}\\{1}", path, a));
}
}
public static class Helpers
{
// Moves the directory back one step
public static string DirMoveBack(string path)
{
for (int a = path.Length - 1; a > 0; a--)
if (path[a] == '\\')
return path.Substring(0, a);
return path;
}
}
正如你所看到的,这是非常混乱的。如果您运行代码,它将创建所需的文件夹结构,但我希望它以递归方式完成。我试图扩大我的思维方式,这似乎是一个真正的脑筋急转弯。任何帮助将不胜感激
答案 0 :(得分:5)
是的,递归更短:)适合任何类似于树结构的东西:
static void Main(string[] args) {
CreateFolders(3, "c:\\temp\\temp");
}
static void CreateFolders(int depth, string path) {
if (depth <= 0) return;
for (int ix = 0; ix <= 10; ++ix) {
var dir = Path.Combine(path, ix.ToString());
System.IO.Directory.CreateDirectory(dir);
CreateFolders(depth - 1, dir);
}
}
答案 1 :(得分:4)
这是一个非常简单的系统,可以递归地为x
级别创建0-10个文件夹。导致图片中列出的结构。这个概念非常简单,该方法调用自身传递path
和depth
参数。如果path
是根路径,则应在该递归级别创建文件夹,depth
是要创建的其余子文件夹。您将注意到每次递归调用时depth
参数减1,直到等于零。在零处,递归停止。
static void Main(string[] args)
{
int maxDepth = 5;
string initialPath = @"D:\testFolders";
createFolders(initialPath, maxDepth);
}
static void createFolders(string path, int depth)
{
depth--;
for (int i = 0; i <= 10; i++)
{
string directory = Path.Combine(path, i.ToString());
if (!Directory.Exists(directory))
Directory.CreateDirectory(directory);
if (depth > 0)
createFolders(directory, depth);
}
}