【发布时间】:2009-03-07 00:08:44
【问题描述】:
我想编写一个网页,用户可以在其中搜索 NTFS 上的目录以符合某些条件并显示结果。
目录是否必须被索引?
是否有可用于查询目录的 .NET 可访问 Windows 搜索 API?
【问题讨论】:
我想编写一个网页,用户可以在其中搜索 NTFS 上的目录以符合某些条件并显示结果。
目录是否必须被索引?
是否有可用于查询目录的 .NET 可访问 Windows 搜索 API?
【问题讨论】:
你得到的只是 System.IO.DirectoryInfo,它甚至没有内置搜索。
大多数人最终都会编写一个递归方法,在每个 DirectoryInfo 上调用 getDirectories 和 getFiles。
【讨论】:
This 是一个名为 FileSelector 的可重用类,它根据名称(使用通配符)、大小、时间戳和属性进行文件选择。
用法是这样的:
Ionic.FileSelector ff = new Ionic.FileSelector(selectionCriteria);
var filesToAdd = ff.SelectFiles(directoryOnDisk, recurseDirectories);
selectionCriteria 是这样的:
*.txt
name = *.txt
size > 10000
name = *.txt and size > 20000
attributes = H and name = *.doc
name = *.cs~ and mtime < 2009-02-14
mtime < 2009-01-01 and (name = *.cs or name = *.vb)
(name = '* Report.docx' or name = *.pptx)
...其中 mtime 表示“上次写入时间”,atime 表示“上次访问时间”,ctime 表示“创建时间”,attributes 指的是 NTFS 属性集,如 System、Hidden、Readonly、Archive 和 ContentIndexed (S、H、R、A、I)。
只有当中间有空格时,文件名模式才需要单引号。
您可以获取此文件选择器类的源代码并在任何地方使用它。
【讨论】:
您可以使用 windows 搜索 API this way,但我不太喜欢这种方式。
如果你有时间自己索引目录,我推荐你试试Lucene.net,肯定比windows索引服务快。
无论如何,最短的方法是使用 System.IO.DirectoryInfo.GetDirectories。
【讨论】:
DirectoryInfo.GetFiles 确实支持通过子目录递归。它是重载方法之一。它只允许您按文件名过滤。
【讨论】:
如果您使用的是 .NET 2.0 或更高版本(以及 VB.Net),那么您可以使用 My.Computer.FileSystem.GetFiles Method。这个方法有三个参数:
SearchType enumeration 有两个值,其中之一是 SearchAllSubDirectories。所以 1 方法返回所有匹配的文件(名称)的只读字符串集合。
如果您使用的是 C#,那么您可以使用 DirectoryInfo.GetFiles Method 。 DirectoryInfo.GetFiles 只有 2 个参数:
如果您为 SearchOption 指定 AllDirectories,您会得到类似的结果。
主要区别在于 FileSystem.GetFiles 作为字符串集合返回,而 DirectoryInfo.GetFiles 返回 FileInfo 对象数组。
【讨论】: