3

我以前<cfdirectory>只获取目录,但我需要在用 cfscript 编写的 UDF 中执行此操作,因此我需要使用 DirectoryList()。看来我需要获取所有内容,然后手动访问结果过滤目录。但是,有一个过滤器参数......它可以用来只过滤目录吗?如果是这样,过滤器是什么?

我还没有找到只返回目录的示例,并且文档不清楚可以过滤的内容(*.txt 除外)。

4

5 回答 5

5

<cfdirectory action="list"...>(and 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>
于 2012-04-22T15:35:35.787 回答
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

但是,由于该模式仅适用于名称,因此不能用于可靠地识别目录。

于 2012-04-22T02:30:41.397 回答
1

Leigh 的答案是正确的(像往常一样 :) 但我想我会把这段代码作为一个非常简单的解决方法。

<cfdirectory directory="c:\blah" name="myDirQuery" action="LIST"/>

<Cfquery name="myDirQuery" dbtype="query">
  SELECT * FROM myDirQuery where type = 'dir'
</cfquery>

你可以很容易地将它包装在你自己的函数中。尽管有过滤的限制,这可以让你得到你想要的。

于 2012-04-23T14:23:11.937 回答
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]);
}
于 2015-02-03T19:10:14.727 回答
1

从 CF11 开始,现在可以按名称过滤目录。该版本增强了DirectoryList()以添加对“类型”属性的支持。例如,要搜索包含“docs”的目录名称:

CF2018+(使用命名参数)

result = DirectoryList(path="c:\path",filter="*docs*", type="dir");

CF2016 及更早版本

result = DirectoryList("c:\path", false, "query", "*docs*", "asc", "dir" );
于 2019-07-17T19:52:40.843 回答