ColdFusion DirectoryList () - возможно ли получить только каталоги?

Я использовал <cfdirectory> чтобы получить только каталоги, но мне нужно сделать это внутри UDF, написанного на cfscript, поэтому мне нужно использовать DirectoryList(). Похоже, что мне нужно получить все, а затем посетить каталоги фильтрации результатов вручную. Тем не менее, есть параметр фильтра... его можно использовать для фильтрации только каталогов? Если это так, что будет фильтр?

Я не нашел пример, который будет возвращать только каталоги, и в документации не ясно, что можно отфильтровать (кроме *.txt).

4 ответа

Решение

К сожалению нет. В отличие от cfdirectory's type атрибут, фильтры применяются только к именам файлов / каталогов. Поэтому я не думаю, что это можно использовать filter найти только каталоги. Имейте в виду, что вы всегда можете обернуть cfdirectory в функцию, а затем вызывать ее из UDF. Это то, что делает старая функция DirectoryList на cflib.org.

в документации неясно, что можно фильтровать (кроме *.txt).

Вы можете только искать имя. filter поддерживает частичные шаблоны (например, поиск файлов, содержащих "xxx"), поиск по расширениям файлов, или вы можете применить несколько шаблонов, используя "|":

*test*        // partial pattern. names containing the word "test"
*.xls         // find Excel files
*test*|*.xls  // find names containing "test" OR Excel files

Однако, поскольку шаблон применяется только к имени, его нельзя использовать для надежной идентификации каталогов.

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

Ответ Ли - правильный (как обычно:), но я подумал, что добавлю этот код, как мертвую легкую работу.

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

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

Вы можете легко обернуть его в свою собственную функцию. Это дает вам то, что вы хотите, несмотря на ограничения фильтрации.

Теперь можно фильтровать каталоги по имени, начиная с CF11. Эта версия улучшила DirectoryList(), добавив поддержку атрибута type. Например, для поиска в именах каталогов, содержащих "документы":

CF2018+ (с использованием именованных параметров)

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

CF2016 и ранее

result = DirectoryList("c:\path", false, "query", "*docs*", "asc", "dir" );

Я использовал это в прошлом.

`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]);
    }
Другие вопросы по тегам