Count files in one directory filtered by a set of filetypes

How to count the number of files by file type in one directory when not only one file type is searched but two or more file types, e.g.: .jpg,.gif,.png
The file types are not fixed but provided by a variable. Here an example:
<cfset fileTypes=".jpg,.gif,.png" >
Result needed is only the number of files not the list of files.

Best solution will get all points, no split, so be serious that you have a better solution then Query of Queries from a cfdirectory.

LVL 63
ZvonkoSystems architectAsked:
Who is Participating?
 
dgrafxConnect With a Mentor Commented:
#arraylen(REMatch(replace(lcase(fileTypes),",","|","all"), lcase(valuelist(files.name))))#

where files is the cfdirectory query
and fileTypes is the ".jpg,.gif,.png" list variable

as is common with regex - very fast
0
 
ZvonkoSystems architectAuthor Commented:
Sorry, the cfset example was misleading.
Every user has a different value for his fileTypes.
0
Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

 
daviddrivCommented:
Well, in VBScript, I would split the list of file types into an array, iterate through the array, and search the file list for files with that extension and use a variable to hold the count...  Or, even better, in Linux I would ls -ld *.jpg *.gif *.png | wc -l
0
 
ZvonkoSystems architectAuthor Commented:
Sorry, I assumed it is obvious from the question Zone: the solution should work on ColdFusion application server and should not depend on OS file system or tools.
0
 
Scott BennettManager TechnologyCommented:
If you don't want to do a query of queries, then the best way to get the numbers is probably to cfloop through your list of filters, do a cfdirectory for each file type and then use the record count from the result set. Like this
<cfset fileTypes=".jpg,.gif,.png,.htm" >
<cfloop list="#fileTypes#" index="i">
<cfdirectory action="LIST" directory="#expandpath('/POToOracle')#" filter="*#i#" sort="name" name="results">
<cfoutput>#i# - #results.recordcount# files<br></cfoutput>
</cfloop>

Open in new window

0
 
ZvonkoSystems architectAuthor Commented:
OK, then sorry again I have not limited the cfdirectory to one call. But that is the requirement.
0
 
ZvonkoSystems architectAuthor Commented:
Thanks dgrafx.
For better understanding here the cfdump output from one example:
<title>dgrafx's types</title>
 
<cfdirectory directory="#GetDirectoryFromPath(GetTemplatePath())#vw" name="files" action="LIST" >
 
<cfset fileTypes=".jpg,.gif,.png" >
<cfset numret=arraylen(REMatch(replace(lcase(fileTypes),",","|","all"), lcase(valuelist(files.name))))>
 
<cfoutput>
filenames:#lcase(valuelist(files.name))#<br>
types: #replace(lcase(fileTypes),",","|","all")#<br>
<cfdump var="#REMatch(replace(lcase(fileTypes),",","|","all"), lcase(valuelist(files.name)))#" >
 
numret: #numret#
</cfoutput>

Open in new window

dgrafxtypes.jpg
0
 
ZvonkoSystems architectAuthor Commented:
Thanks dgrafx for sharing your nice solution.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.