While preparing for a presentation I'm doing on ColdFusion 11 on Wednesday night, I discovered an interesting update to the directoryList function. In ColdFusion 11 you can now pass a function for filtering as opposed to just a list of extensions. (And yes, a list is valid - I'll explain more in a bit.) The example function was a bit messy so I updated it to make it a bit nicer. Here is the example.
boolean function filterBySize(path, type, extension) {
var sizeLimit = 1024 * 100; //more than 10 KB
var extensionList = "jpg,jpeg,gif,png";
if(type is "dir") return false;
if(listFindNoCase(extensionList,extension)) {
var fileInfo = getFileInfo(path);
var size = fileInfo.size;
if(size >= sizeLimit) return true;
}
return false;
}
filteredResults = directorylist(expandPath("."), true, "path", filterBySize);
writeDump(filteredResults);
Pretty nifty, right? Of course, it isn't too difficult to do in ColdFusion 10 either. Here's a version backported:
filteredFiles = arrayFilter(directoryList("/Users/ray/Dropbox/pictures", true, "path","*.jpg|*.jpeg|*.gif|*.png"), function(path) {
var sizeLimit = 1024 * 1000;
var fileInfo = getFileInfo(path);
var size = fileInfo.size;
if(size >= sizeLimit) return true;
return false;
});
This is pretty much the same except I put the directoryList inside a call to arrayFilter. Oh, and by the way, even though the docs have said for a while now that the extension filter argument only supported one extension, that isn't true. For a while now you've been able to pass multiple extensions by using the pipe as a delimiter. I fixed that in the docs (while I was fixing the example code too).