2012-04-22 24 views
2

我已經使用<cfdirectory>來獲取只有目錄,但我需要在用cfscript編寫的UDF內部執行此操作,所以我需要使用DirectoryList()。看起來我需要獲取所有內容,然後手動訪問結果過濾目錄。但是,有一個過濾器參數...它可以用來只過濾目錄嗎?如果是這樣,過濾器是什麼?ColdFusion DirectoryList() - 是否可以只獲取目錄?

我還沒有找到一個將只返回目錄的例子,並且文檔不清楚什麼可以被過濾(* .txt除外)。

+0

不確定你的用例是什麼,但你可以循環訪問目錄列表(獲得結果後)並過濾掉任何帶擴展名的文件以刪除所有文件? – 2012-04-22 14:08:17

回答

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 

然而,由於該模式僅適用於名稱,它不能用於可靠地識別目錄。

+1

僅供參考:Adobe提供了一個功能請求來解決這個問題:https://bugbase.adobe.com/index.cfm?event=bug&id=3039908。這可能是值得投票的,爲了得到它的一些牽引力(雖然它已經錯過了CF10船:-( – 2012-04-22 11:16:58

+0

感謝亞當!我會投它。 – Redtopia 2012-04-23 02:47:22

5

<cfdirectory action="list"...>(和DirectoryList(path [,recurse] [,listInfo="query"]...))返回查詢對象。沒有理由不能這麼做,然後立即在TYPE列上進行查詢查詢過濾。

馬克克魯格提醒我,我也許應該包括代碼:

<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> 
+0

同意...但方式更多的工作比我想做的。謝謝! – Redtopia 2012-04-23 02:53:03

+0

這樣做,並將它包裝在一個UDF(DirectoryList2)中,肯定會讓你不必每次都這樣做。 – ale 2012-04-23 12:59:14

+1

是的,聽起來你會想要一個包裝函數(即使用'DirectoryList' + QoQ或'fdirectory').Al的方法的另一個優點是它可以用在所有的cfscript組件中。關於唯一的區別是過濾完成的地方。如果你通常擁有比目錄多得多的文件,那麼使用'cfdirectory'的包裝可能會更有效率。否則,它可能沒有太大的區別。 – Leigh 2012-04-23 20:21:22

1

Leigh的答案是正確的(像往常一樣:)不過我想我會在這段代碼中拋出的死很容易變通。

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

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

你可以很容易地將它包裝在你自己的函數中。儘管有過濾的限制,這會讓你得到你想要的。

+0

抱歉過早發佈......長時間的問題。 – 2012-04-23 14:24:58

+0

這就是我說的,無碼。 – ale 2012-04-23 23:57:57

+0

呃....是的。對不起,我錯過了 - 所有功勞都歸功於你。我會投你的答案:) – 2012-04-24 00:01:56

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]); 
    } 
相關問題