[英]How to Store Sub directory in a list c#
the below code will display all sub-directories contained in the main directory下面的代码将显示主目录中包含的所有子目录
i need to get the data displayed by method LoadSubDirs(string dir) stored in a list我需要获取存储在列表中的方法 LoadSubDirs(string dir) 显示的数据
class Program
{
static void Main(string[] args)
{
string root = @"D:\";
string[] subdirectories = Directory.GetDirectories(root);
foreach (string subdir in subdirectories)
{
LoadSubDirs(subdir);
}
}
private static void LoadSubDirs(string dir)
{
Console.WriteLine(dir);
try
{
string[] subdirectories = Directory.GetDirectories(dir);
foreach (string subdir in subdirectories)
{
try
{
LoadSubDirs(subdir);
}
catch { }
}
}
}
}
This is your code, with the directory saved in a List object这是您的代码,目录保存在 List 对象中
using System.IO;
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
string root = @"D:\";
string[] subdirectories = Directory.GetDirectories(root);
List<string> listDirs = new List<string>();
foreach (string subdir in subdirectories)
{
LoadSubDirs(subdir, listDirs);
}
}
private static void LoadSubDirs(string dir, List<string> listDirs)
{
Console.WriteLine(dir);
listDirs.Add(dir);
try
{
string[] subdirectories = Directory.GetDirectories(dir);
foreach (string subdir in subdirectories)
{
try
{
LoadSubDirs(subdir, listDirs);
}
catch { }
}
}
}
}
If your goal is to use properly recursivity, I think you should do like that.如果您的目标是正确使用递归,我认为您应该这样做。 In my opinion if you "loop" a first time before calling your recursive function you're missing something.
在我看来,如果您在调用递归函数之前第一次“循环”,那么您会遗漏一些东西。 And if you're using a class/struct like FolderStruct here, you keep the "tree", wich can be useful sometimes.
如果你在这里使用像 FolderStruct 这样的类/结构,你可以保留“树”,这有时很有用。
public class FolderStruct
{
public string FolderName { get; set; }
public List<FolderStruct> FolderChildren { get; set; }
}
class Program
{
static void Main(string[] args)
{
FolderStruct FolderTree = new FolderStruct
{
FolderName = @"D:\",
FolderChildren = new List<FolderStruct>()
};
LoadSubDirs(FolderTree);
Console.ReadKey();
}
private static FolderStruct LoadSubDirs(FolderStruct FolderTree)
{
try
{
string[] subdirectories = Directory.GetDirectories(FolderTree.FolderName);
if (subdirectories != null)
{
foreach (string subdir in subdirectories)
{
var newFolder = new FolderStruct()
{
FolderName = subdir,
FolderChildren = new List<FolderStruct>()
};
var ret = LoadSubDirs(newFolder);
if (ret != null)
FolderTree.FolderChildren.Add(ret);
}
return FolderTree;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
return null;
}
}
See sample code below :请参阅下面的示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace SAveDirectoriesXml
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
const string FOLDER = @"c:\temp";
static XmlWriter writer = null;
static void Main(string[] args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
writer = XmlWriter.Create(FILENAME, settings);
writer.WriteStartDocument(true);
DirectoryInfo info = new DirectoryInfo(FOLDER);
WriteTree(info);
writer.WriteEndDocument();
writer.Flush();
writer.Close();
Console.WriteLine("Enter Return");
Console.ReadLine();
}
static long WriteTree(DirectoryInfo info)
{
long size = 0;
writer.WriteStartElement("Folder");
try
{
writer.WriteAttributeString("name", info.Name);
writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
foreach (DirectoryInfo childInfo in info.GetDirectories())
{
size += WriteTree(childInfo);
}
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
FileInfo[] fileInfo = null;
try
{
fileInfo = info.GetFiles();
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error",errorMsg);
}
if (fileInfo != null)
{
foreach (FileInfo finfo in fileInfo)
{
try
{
writer.WriteStartElement("File");
writer.WriteAttributeString("name", finfo.Name);
writer.WriteAttributeString("size", finfo.Length.ToString());
writer.WriteAttributeString("date", info.LastWriteTime.ToString());
writer.WriteEndElement();
size += finfo.Length;
}
catch (Exception ex)
{
string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
Console.WriteLine(errorMsg);
writer.WriteElementString("Error", errorMsg);
}
}
}
writer.WriteElementString("size", size.ToString());
writer.WriteEndElement();
return size;
}
}
}
I'm not sure if I've totally overlooked the requirement, but it seems like you are trying to get a list of all sub-directories from root
and stored them in a List<string>
.我不确定我是否完全忽略了这个要求,但似乎您正在尝试从
root
目录获取所有子目录的列表并将它们存储在List<string>
。
This code will achieve exactly that without any additional methods or headache:这段代码将完全实现这一目标,无需任何额外的方法或头痛:
static void Main(string[] args)
{
string root = @"D:\";
List<string> listDirs = Directory.GetDirectories(root, "*.*", SearchOption.AllDirectories).ToList();
}
Using Directory.GetDirectories
with the SearchOption.AllDirectories
parameter will automatically return all sub-directories as an array of string
.使用带有
SearchOption.AllDirectories
参数的Directory.GetDirectories
将自动将所有子目录作为string
数组返回。
Given that you want it as a List<string>
, use .ToList()
from Linq to convert the string array to the list.鉴于您希望将其作为
List<string>
,请使用 Linq 中的.ToList()
将字符串数组转换为列表。 Remember to add using System.Linq
to your imports.请记住将
using System.Linq
添加到您的导入中。
static void Main(string[] args)
{
string root = @"D:\";
List<string> list= Recursive(root);
foreach (string l in list)
{
Console.WriteLine(l);
}
}
static IEnumerable<string> Recursive(string root )
{
string[] subdirectories = Directory.GetDirectories(root);
yield return root;
if(subdirectories !=null && subdirectories.Length>0)
{
foreach(var sub in subdirectories)
{
foreach(var subsub in Recursive(sub))
yield return subsub;
}
}
else
{
yield break;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.