最终目标是具有某种形式的数据结构,该数据结构存储要存储在txt文件中的目录的层级结构.
我正在使用以下代码,到目前为止,我正在努力组合目录,子目录和文件.
/// <summary>
/// code based on http://msdn.microsoft.com/en-us/library/bb513869.aspx
/// </summary>
/// <param name="strFolder"></param>
public static void TraverseTree ( string strFolder )
{
// Data structure to hold names of subfolders to be
// examined for files.
Stack<string> dirs = new Stack<string>( 20 );
if ( !System.IO.Directory.Exists( strFolder ) )
{
throw new ArgumentException();
}
dirs.Push( strFolder );
while ( dirs.Count > 0 )
{
string currentDir = dirs.Pop();
string[] subDirs;
try
{
subDirs = System.IO.Directory.GetDirectories( currentDir );
}
catch ( UnauthorizedAccessException e )
{
MessageBox.Show( "Error: " + e.Message );
continue;
}
catch ( System.IO.DirectoryNotFoundException e )
{
MessageBox.Show( "Error: " + e.Message );
continue;
}
string[] files = null;
try
{
files = System.IO.Directory.GetFiles( currentDir );
}
catch ( UnauthorizedAccessException e )
{
MessageBox.Show( "Error: " + e.Message );
continue;
}
catch ( System.IO.DirectoryNotFoundException e )
{
MessageBox.Show( "Error: " + e.Message );
continue;
}
// Perform the required action on each file here.
// Modify this block to perform your required task.
/*
foreach ( string file in files )
{
try
{
// Perform whatever action is required in your scenario.
System.IO.FileInfo fi = new System.IO.FileInfo( file );
Console.WriteLine( "{0}: {1}, {2}", fi.Name, fi.Length, fi.CreationTime );
}
catch ( System.IO.FileNotFoundException e )
{
// If file was deleted by a separate application
// or thread since the call to TraverseTree()
// then just continue.
MessageBox.Show( "Error: " + e.Message );
continue;
}
}
*/
// Push the subdirectories onto the stack for traversal.
// This could also be done before handing the files.
foreach ( string str in subDirs )
dirs.Push( str );
foreach ( string str in files )
MessageBox.Show( str );
}
Run Code Online (Sandbox Code Playgroud)
您可以使用一种复合模式,其中复合项目 - 是一个文件夹.
这是一个示例代码,用于构建目标文件夹的Tree结构.它以递归方式工作,并消耗更多内存,但简单值得.
class TreeItem
{
public string FolderName;
public List<TreeItem> SubFolders = new List<TreeItem>();
public string[] Files;
}
class Program
{
private static TreeItem FileTree(string rootFolder){
var item = new TreeItem();
item.FolderName = rootFolder;
item.Files = System.IO.Directory.GetFiles(rootFolder);
foreach(var folder in System.IO.Directory.GetDirectories(rootFolder))
{
item.SubFolders.Add(FileTree(folder));
}
return item;
}
//Traversal algorithm
private static void PrintComposite(TreeItem node, int ident)
{
var dirName = System.IO.Path.GetFileName(node.FolderName);
Console.WriteLine(@"{0}{1}", new string('-', ident), dirName);
foreach(var subNode in node.SubFolders)
{
PrintComposite(subNode, ident + 1);
}
}
public static void Main(string[] args)
{
var tree = FileTree(@"D:\Games");
PrintComposite(tree,0);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3346 次 |
| 最近记录: |