ColdFusion DirectoryList() - 是否可以只获取目录?

时间:2012-04-22 01:51:57

标签: coldfusion cfdirectory

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

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

5 个答案:

答案 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" );