递归创建目录树

时间:2017-11-30 15:56:20

标签: c# sql recursion directory

我的sql数据库中有一个目录树,我是从硬盘上的目录创建/上传的。

现在我想要将其反转并将其重新载入我的电脑。

问题在于我不知道如何以递归方式执行此操作。

我的计划到现在为止:

获取目录名(从我选择下载目录的组合框中)和创建目录。 查找子目录(通过PK和Parent_ID管理)(因为文件夹中可以有更多子文件夹)按字母顺序排序。在根目录下的pc上创建目录(从原始目录树复制目录树)并搜索该目录是否存在子目录。如果没有,则在字母表中接下来,创建一个目录并检查它是否有子文件夹。如果它有子文件夹,请对它们进行排序,转到第一个,在pc上创建目录,检查它是否有子目录,依此类推。

我希望我能说清楚我的想法。但由于存在几乎无限组合和隔行扫描的可能性,我将不得不以递归方式编程,但我很遗憾地缺乏创造力:/

我希望你们中的一些人可以帮助我,让我知道如何解决这个问题。

这是我写的代码,直到第一次递归:

//creating of the root directory on the pc
string rootname = ComboboxRoots.SelectedItem.ToString();
string rootdirectory = TextboxDestination.Text + "\\" + rootname;
Methods.CreateDir(rootdirectory);

//searching for subfolders in sql database, if there are several sort them alphabetically in an array
int? rootPK = Methods.getFolderPK(rootname);
int pk_dirRoot;
pk_dirRoot = rootPK ?? default(int);
string [] dirname = Methods.GetDirname("SELECT dirname FROM  FolderUpload_Directorys WHERE parent_id = @rootpk", pk_dirRoot);
string sortedDirnames = "";
if(dirname.Length > 1){
    Array.Sort(dirname);
    for(int a = 0; a < dirname.Length; a++){
        if(dirname[a] != null){
            sortedDirnames = sortedDirnames + "/" + dirname[a];
        }                   
    }           
}

string[] DirnamesTokens = sortedDirnames.Split('/');
//going through sorted array
//with each entry,create directory on pc and see if there are subfolders, if multiple, sort them, create directory for first entry, check if it has subfolders......
for(int a  = 0; a < DirnamesTokens.Length; a++){

}

修改

我使用SQL Server和Microsoft SQL Server Management Studio。

这些是我使用的方法:

获取特定Foldername的PrimaryKey:

public static int? getFolderPK(string dirname)
{
    using (SqlConnection cn = new SqlConnection(@"Data Source=EVOPC18\XXX;Initial Catalog=XXX;Persist Security Info=True; Trusted_Connection = True"))
    using (SqlCommand cm = cn.CreateCommand())
    {
        cm.CommandText = @"
    SELECT pk_dir
    FROM   FolderUpload_Directorys
    WHERE  dirname = @dirname";
        cm.Parameters.AddWithValue("@dirname", dirname);
        cn.Open();
        return cm.ExecuteScalar() as int?;
    }
}

获取parent_id的特定PK的目录名称:

public static string[] GetDirname(string Command, int rootpk)
{
    string [] dirnames =  new string [100];
    int a = 0;

    using (SqlConnection connection = new SqlConnection(@"Data Source=EVOPC18\XXX;Initial Catalog=XXX;Persist Security Info=True; Trusted_Connection = True"))
    using (SqlCommand command = new SqlCommand(Command, connection))

    {
        connection.Open();
        command.Parameters.AddWithValue("@rootpk", rootpk);

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                dirnames[a] = reader["dirname"].ToString();
            }
        }
    }
    return dirnames;
}

这是DB:

enter image description here

0 个答案:

没有答案