专栏首页java跬步用LINQ遍历目录【转】

用LINQ遍历目录【转】

用LINQ遍历一个指定目录并输出为XML

写出的代码如下:

public static XElement ToXml(this DirectoryInfo dir) 
{ 
XElement root = new XElement("Dir", 
new XAttribute("Name", dir.Name), 
from subDir in dir.GetDirectories() 
select DirToXml(subDir), 
from file in dir.GetFiles() 
select new XElement("File", file.Name)); 
return root; 
} 

使用的时候,你可以这样:

DirectoryInfo dir = new DirectoryInfo(path);

XElement dirXml = dir.ToXml();

OK,搞定。

可以看出,LINQ非常强大,既然这么强大,为什么不更进一步呢?

我要遍历一下目录里的制定格式的文件应该怎么做呢?

比如说我要找出目录里的所有的mp3

于是可以写出这样的代码

public static XElement ToXml(this DirectoryInfo dir, string searchPattern) 
{ 
XElement root = new XElement("Dir", 
new XAttribute("Name", dir.Name), 
from subDir in dir.GetDirectories() 
select DirToXml(subDir), 
from file in dir.GetFiles(searchPattern) 
select new XElement("File", file.Name)); 
return root; 
} 

使用的时候是这样

DirectoryInfo dir = new DirectoryInfo(path);

XElement dirXml = dir.DirToXml("*.mp3");

轻松搞定

更进一步,如果我要找多个格式的文件呢?比如说要找出目录里面的图片文件(jpg, bmp, gif…)

Ok,没问题,可以写成这样:

public static XElement ToXml(this DirectoryInfo dir, string[] searchPatterns) 
{ 
XElement root = new XElement("Dir", 
new XAttribute("Name", dir.Name), 
from subDir in dir.GetDirectories() 
select DirToXml(subDir), 
from pattern in searchPatterns 
from file in dir.GetFiles(pattern) 
select new XElement("File", file.Name)); 
return root; 
} 

使用的时候可以这样:

DirectoryInfo dir = new DirectoryInfo(path);

XElement dirXml = dir.DirToXml(new[] { "*.mp3", "*.txt" });

Ok,又搞定了。

为什么我要写三个函数呢?我把三个合并成一个可以吗?试试看吧

于是,代码就成了这样:

public static XElement ToXml(this DirectoryInfo dir, params string[] searchPatterns) 
{ 
XElement root = new XElement("Dir", 
new XAttribute("Name", dir.Name), 
from subDir in dir.GetDirectories() 
select DirToXml(subDir), 
searchPatterns.Length > 0 ? 
(from pattern in searchPatterns.Distinct()  
from file in dir.GetFiles(pattern) 
select new XElement("File", file.Name)) 
: 
    (from file in dir.GetFiles() 
select new XElement("File", file.Name))); 
return root; 
} 

测试一下,perfect!

美中不足的是,在代码中的一个(searchPatterns.Length > 0 ?)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • EXT.NET 使用总结(1)

    从系统改版到现在,将近半年的时间,原本陌生的Ext.NET的UI框架,也慢慢的熟悉了。总的来说,这个UI框架还是很优秀的,但是也没有100%完美的产品(老系统使...

    DougWang
  • .NET Remoting 体系结构 之 消息接收器

    Activator.GetObject()方法调用 RemotingServices.Connect()方法连接已知对象。在 Connect()方法中,Unma...

    DougWang
  • .NET代码错误日志

    DougWang
  • what does the checkbox Continue mean in Text Access Sequence customizing

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang
  • 《基于机器学习的企业定价算法研究》阅读笔记

    http://blog.csdn.net/u011239443/article/details/78126591 《基于机器学习的企业定价算法研究》 冯...

    用户1621453
  • 揭开GANs的神秘面纱

    这篇文章中,作者通过将生成对抗网络(GANs,以下均简称GANs)运用到图片生成任务中向我们解释了其的原理。GANs是无监督学习中少有的成功的技术,一经提出,将...

    昱良
  • 西弗吉尼亚州使用区块链让军方人员进行远程投票

    西弗吉尼亚州国务卿办公室刚刚宣布,该州将测试一项新的试点计划,允许海外军人通过手机投票。现役军事人员将能够通过基于区块链的应用程序使用其国家 ID 进行投票。根...

    周俊辉
  • 优雅使用JsDeliver加速文件

    看到好多人不会用GitHub+JsDeliver来加速自己的静态文件。遂决定水一篇,帮助一下弱者!

    Dreamy.TZK
  • 详解CSS的Flex布局

    Flex是Flexible Box 的缩写,意为"弹性布局",是CSS3的一种布局模式。通过Flex布局,可以很优雅地解决很多CSS布局的问题。下面会分别介绍容...

    前端林子
  • 学术大讲堂 | (二)区块链Web3.0与未来网络 演讲实录

    在介绍区块链技术在网络领域的应用之前,我先讲几个非网络领域的故事。看看针对区块链外部行业是怎么做的,再转回我们网络本行业,思路会更加开阔。

    灯塔大数据

扫码关注云+社区

领取腾讯云代金券