我使用<cfdirectory>
只获取目录,但我需要在用cfscript编写的UDF中执行此操作,因此我需要使用DirectoryList()。看来我需要获取所有内容,然后手动访问结果过滤目录。但是,有一个过滤器参数...它可以用于仅过滤目录吗?如果是这样,过滤器会是什么?
我还没有找到只返回目录的示例,并且文档不清楚可以过滤的内容(* .txt除外)。
答案 0 :(得分:5)
<cfdirectory action="list"...>
(和DirectoryList(path [,recurse] [,listInfo="query"]...)
)返回一个查询对象。没有理由你不能这样做,然后立即对TYPE列进行查询查询过滤。
Mark Kruger提醒我,我应该包括代码:
<cffunction name="DirectoryList2" returntype="query">
<cfargument name="dirPath" type="string" required="true">
<cfif directoryExists(arguments.dirPath)>
<cfdirectory directory="#arguments.dirPath" name="local.DirQuery" action="LIST">
<cfquery name="local.DirQuery" dbtype="query">
SELECT * FROM local.DirQuery WHERE TYPE = 'dir'
</cfquery>
<cfreturn local.DirQuery>
<cfelse>
<cfthrow message="No such directory">
</cfif>
</cffunction>
答案 1 :(得分:3)
不幸的是,没有。与cfdirectory的type
属性不同,过滤器仅应用于文件/目录名称。所以我认为不可能只使用filter
来查找目录。请记住,您始终可以将cfdirectory包装在函数中,然后从UDF中调用它。这就是cflib.org上的旧DirectoryList功能。
文档不清楚可以过滤的内容(除了 * .txt)的
您只能搜索名称。 filter
支持部分模式(例如查找包含“xxx”的文件),按文件扩展名搜索,或者您可以使用"|"
应用多种模式:
*test* // partial pattern. names containing the word "test"
*.xls // find Excel files
*test*|*.xls // find names containing "test" OR Excel files
但是,由于模式仅应用于名称,因此不能用于可靠地识别目录。
答案 2 :(得分:1)
Leigh的回答是正确的(像往常一样:)但我认为我会把这段代码作为一个简单易用的工作。
<cfdirectory directory="c:\blah" name="myDirQuery" action="LIST"/>
<Cfquery name="myDirQuery" dbtype="query">
SELECT * FROM myDirQuery where type = 'dir'
</cfquery>
你可以很容易地将它包装在你自己的函数中。尽管有过滤限制,但这可以满足您的需求。
答案 3 :(得分:1)
我过去曾经用过这个。
`var = dirList(directory_path, false, "query")`
// var is now a query record
dirArray = []; // create an array
for(i = 1;i LTE var.recordcount; i++){
if(var.type[i] IS "dir") dirArray.append(var.name[i]);
}
答案 4 :(得分:1)
从CF11开始,现在可以按名称过滤目录。该版本增强了DirectoryList(),以增加对“ type”属性的支持。例如,要搜索包含“ docs”的目录名称:
CF2018 + (使用命名参数)
result = DirectoryList(path="c:\path",filter="*docs*", type="dir");
CF2016和更早版本
result = DirectoryList("c:\path", false, "query", "*docs*", "asc", "dir" );