当前位置:编程学习 > C#/ASP.NET >>

典型递归,人人有份哦!


亲亲们:现有一个仅能得到当前目录下文件及文件夹的方法,如何得到当前目录下所有文件及文件夹目录呢?


public class Folder
{
string name {get;set;}    //文件或目录名称:如:t1
string path  {get;set;}   //文件或目录的相对路径,如: test/t4/t4.xls

}


即:现有方法:
 List<Folder> GetFolder (string FolderName) 

如有: test目录下有两个文件: t1.txt,t2.doc和一个文件夹:t3

 List<Folder> GetFolder ("test")  
 
能返回name: t1,t2,t3及对应的path.

假如:test当前目录在上述原来基础上,新增了一个文件夹Mytest,Mytest目录下有t4.xls,t5.jpg,也就是说当前目录可以任意创建文件夹或文件,如果是文件夹,里面又可以任意创建文件或文件夹,那么如何实现传递当前文件夹名称(路径亦可)作为参数,返回当前目录下所有的文件及文件夹目录呢?
--------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Folder
    {
        public string Name { get; set; }
        public string Path { get; set; }
    }

    class Program
    {
        static List<Folder> GetFolder(string FolderName)
        {
            return Directory.GetFiles(FolderName)
                .Concat(Directory.GetDirectories(FolderName))
                .Select(x => new Folder() { Name = Path.GetFileName(x), Path = Path.GetDirectoryName(x) }).ToList();
        }

        static List<Folder> GetAllFolders(string FolderName)
        {
            return Regex.IsMatch(FolderName, @"^[a-zA-Z]\:\\$") 
                ?
                    GetFolder(FolderName).SelectMany(x => GetAllFolders(Path.Combine(x.Path, x.Name))).ToList()
                : (new DirectoryInfo(FolderName).Exists
                    ? new List<Folder>() { new Folder() { Name = Path.GetFileName(FolderName), Path = Path.GetDirectoryName(FolderName) } }.Union(GetFolder(FolderName).SelectMany(x => GetAllFolders(Path.Combine(x.Path, x.Name)))).ToList()
                    : new List<Folder>() { new Folder() { Name = Path.GetFileName(FolderName), Path = Path.GetDirectoryName(FolderName) } });
        }

        static void Main(string[] args)
        {
            var result = GetAllFolders(@"C:\");
            foreach (var item in result)
                Console.WriteLine(Path.Combine(item.Path, item.Name));
        }
    }
}
--------------------编程问答--------------------





--------------------编程问答--------------------
引用 2 楼 Leedye123 的回复:







你表测试C:\,会很慢滴。

你选一个存放你文档的文件夹吧,还有权限要足够。 --------------------编程问答-------------------- 先谢谢您哈! 是这样的,亲:真实的生产环境和遍历盘符下的文件还是略有区别!

即:Directory.GetFiles等遍历文件的系统方法是确定用不到(不能用),您可以看做返回的是就是普通的自定义类,关键是返回当前文件目录(姑且这么称呼)[叫做当前节点或许更合适]下的所有节点! 
核心代码可能也需要劳您微调下吧? --------------------编程问答-------------------- 亲也早休息哈! --------------------编程问答--------------------
引用 4 楼 Leedye123 的回复:
先谢谢您哈! 是这样的,亲:真实的生产环境和遍历盘符下的文件还是略有区别!

即:Directory.GetFiles等遍历文件的系统方法是确定用不到(不能用),您可以看做返回的是就是普通的自定义类,关键是返回当前文件目录(姑且这么称呼)[叫做当前节点或许更合适]下的所有节点! 
核心代码可能也需要劳您微调下吧?


我只在List<Folder> GetFolder (string FolderName) 这个方法里面用Directory.GetFiles
既然你说这个方法有了,替换成你的实现好了。 --------------------编程问答-------------------- 之所以用了DirectoryInfo(FolderName).Exists,是因为你的Folder对象判断不出来这是文件还是文件夹。 --------------------编程问答-------------------- 早啊!辛苦鸟! Path.Combine ,Path.GetFileName, Path.GetDirectoryName,DirectoryInfo(FolderName).Exists这些方法好像都是文件操作的系统方法,大大能否替换为对普通带节点文本内容的操作呢? 
--------------------编程问答-------------------- 而且Path不是System.IO命名空间下的Path,在此看您可做小写的path的普通只读属性(有get,但没set),它本身没有自带任何的方法哦。 --------------------编程问答--------------------
引用 8 楼 Leedye123 的回复:
早啊!辛苦鸟! Path.Combine ,Path.GetFileName, Path.GetDirectoryName,DirectoryInfo(FolderName).Exists这些方法好像都是文件操作的系统方法,大大能否替换为对普通带节点文本内容的操作呢? 

你非要定义一个不能区分目录和文件(Node and Leaf)同时又非要把路径拆成Path和Name的奇怪的数据结构。搞得本来可以很简单的代码都必须为你这古怪的数据结构作适配。 --------------------编程问答--------------------
引用 9 楼 Leedye123 的回复:
而且Path不是System.IO命名空间下的Path,在此看您可做小写的path的普通只读属性(有get,但没set),它本身没有自带任何的方法哦。


我完全按照你的意思写的。 --------------------编程问答-------------------- 不做文件和文件夹区分了,统一都返回他们的name及path(path您就看做和name一样的string普通属性,和文件路径无关.)即:现在就是说返回当前节点(如:test下)所有的叶节点(都是string),都是(节点型)字符串操作,能否实现呢? --------------------编程问答-------------------- 不好意思啦,可能是我没表述清楚。。 --------------------编程问答-------------------- Path.Combine(x, y)
用 x + 路径分割符 + y 代替

Path.GetFileName(x) 从中提取最后一个路径分割符之后的字符串

DirectoryInfo(FolderName).Exists替换成你判断这个节点是Node还是Leaf的代码。 --------------------编程问答-------------------- 嗯,这么说吧!
也就是说有本身有一个能返回当前节点下(深度仅一级,不遍历下面的子节点)的方法: List<Folder> GetFolder (string FolderName) 
,现在相当于(尽量)利用(GetFolder)这个方法来返回某个节点名称下的所有节点内容(遍历当前节点下的所有的节点!  特殊地方甚至可以用伪代码,如:if(currentnode Contains subfolder) [含义为:当前节点包含子节点])),您看如何呢? --------------------编程问答--------------------
引用 15 楼 Leedye123 的回复:
嗯,这么说吧!
也就是说有本身有一个能返回当前节点下(深度仅一级,不遍历下面的子节点)的方法: List<Folder> GetFolder (string FolderName) 
,现在相当于(尽量)利用(GetFolder)这个方法来返回某个节点名称下的所有节点内容(遍历当前节点下的所有的节点!  特殊地方甚至可以用伪代码,如:if(currentnode Contains subfolder) [含义为:当前节点包含子节点])),您看如何呢?

我真实代码都给你了,你还要什么伪代码。 --------------------编程问答-------------------- 你把我说的那几个用到Path解析字符串的地方替换成你的实现就可以了。 --------------------编程问答-------------------- 嗯,我先试下,不行的话还得劳驾您咯... --------------------编程问答-------------------- good... --------------------编程问答-------------------- 技术性观摩讨论内容。 --------------------编程问答--------------------
public void print(File f)
{
if(f!= null)
{
if(f.isDirectory())
{
File[] fileArray = f.listFiles();
if(fileArray != null)
{
for(int i=0; i<fileArray.length; i++)
{
print(fileArray[i]);
}
}

}
else
{
System.out.println(f);
}
}
}
--------------------编程问答-------------------- 比物连类 --------------------编程问答-------------------- 都是高手啊? --------------------编程问答-------------------- 递归遍历系统所有文件文件? --------------------编程问答-------------------- 看到递归我进来的,因为这个问题以前在校总是困扰我!
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,