At one of the
usergroup sessions this week someone asked if there was a way to get file information (size, date time, etc.) easily using a function. I said they should use <CFDIRECTORY>, but afterwards remembered that we did indeed add a new function to
Scorpio called GetFileInfo() which returns a structure containing:
- canread
- canwrite
- ishidden
- lastmodified
- name
- parent
- path
- size
- type
Which makes this a good opportunity to review some of the file i/o changes coming in Scorpio.
For starters, if you have ever had to work with large text files in ColdFusion (maybe parsing a large CSV file) you'll know that doing so is very inefficient. You probably use code like this:
<!--- Read entire file --->
<cffile action="read"
file="#fileName#"
variable="myFile">
<!--- Loop through file variable one line at a time --->
<cfloop list="#myFile#"
index="line"
delimiters="#chr(10)##chr(13)#">
<!--- Do stuff with line here --->
...
</cfloop>
This is slow for two reasons. Not only does ColdFusion read the entire file into memory in a variable all at once, but also looping through the file requires treating it as a list which involves lots of parsing which can also be resource intensive.
Well, inefficient no more. In ColdFusion Scorpio you'll be able to replace the above code block with this:
<!--- Loop through file one line at a time --->
<cfloop file="#fileName#"
index="line">
<!--- Do stuff with line here --->
...
</cfloop>
This code block open the file, reads one line at a time, and closes it when done. I actually used this myself recently in a ColdFusion code snippet that had to parse a massive tab delimited file, turning each line into a query row. Replacing the old <CFFILE> <CFLOOP> with a new <CFFILE FILE=> cut down processing time from several minutes to under 10 seconds.
Oh, and although reading files line by line is the more common use case, you can also read by n characters at a time, like this:
<!--- Loop through file 100 characters at a time --->
<cfloop file="#fileName#"
index="chars"
characters="100">
<!--- Do stuff with line here --->
...
</cfloop>
In addition to the <CFLOOP> enhancements, we've also added lots of new file i/o functions that you can use to access and manipulate files directly. The new functions include:
- FileClose()
- FileCopy()
- FileDelete()
- FileIsEOF()
- FileMove()
- FileOpen()
- FileRead()
- FileReadBinary()
- FileReadLine()
- FileSetAccessMode()
- FileSetAttribute()
- FileSetLastModified()
- FileWrite()
- GetFileInfo()
- IsImageFile()
- IsPDFFile()
--- Ben
Seriously, looks like we're getting some very nice robust enhancements.
Some which I can use like now! :-0
Anyways, I do look forward to the release and your teaser points are nice to read. It's comforting to know the there are advantages to an owned and fiscally supported product - ie: features, and that Adobe's first full release under their own name (I think the current version has one of Adobe's longest official products names, something like "Macromedia ColdFusion MX 7 Standard Edition By Adobe", or something like that) should be a substantial re-launch for the product.
Fantastic new feature.
This is just great work. Thanks for all you did.