我的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: