Coldfusion 如何知道此变量是否为文件句柄?

Coldfusion 如何知道此变量是否为文件句柄?,coldfusion,Coldfusion,假设我有这个代码: function doFileStuff(){ var file = ""; try { file = fileOpen(filePath); // do stuff with file } finally { fileClose(file); } } 如果fileOpen()进程失败,则调用fileClose()将出错。我需要做的是这类事情(伪代码): 我知道我仍然可以测试文件是否是空

假设我有这个代码:

function doFileStuff(){
    var file = "";
    try {
        file = fileOpen(filePath);
        // do stuff with file
    }
    finally {
        fileClose(file);
    }
}
如果
fileOpen()
进程失败,则调用
fileClose()
将出错。我需要做的是这类事情(伪代码):

我知道我仍然可以测试文件是否是空字符串,这对我来说很有用,但它并没有测试我应该测试的内容:文件是否是文件句柄。我可以检查对象的Java类,但对我来说,这听起来有点不对劲,应该有一种CFML方法来完成

应该有类似于isFile()的东西,不是吗?我在文件里找不到这样的东西


有什么想法/建议吗?我已经对我的工作进行了更深入的调查。这里太罗嗦了。

我把这个标记为回答:基本上没有本地的方式来做这件事。我得把它整理一下

感谢所有的反馈


更新:根据我提出的问题,这已经在ColdFusion 11中实现为
isFileObject()

有趣的问题。我将使用
java.io.File
类。除了新的vfs功能外,CF内部使用的是它的文件操作


利用java不应该被认为是黑客行为。有时这是一种绝对必要的东西;-)

我扩展了现有TypeOf()UDF的功能,添加了对返回任何变量类型的支持。您可以使用它来确定变量的类型是“FileHandler”(还是“FileHandlerJava”),然后相应地关闭它。它与ColdFusion 9+一起工作。我发布这个解决方案是因为我们没有升级到CF11

TypeOf()自定义项(和示例用法)


Adam,你能用文件处理程序返回的一个键来测试它是否是“真的”吗。可能类似于if(file.size>0){//do your thing}?我的感觉是,如果file.size返回一个正值,它可能是一个真实的文件。也许这对你的需求来说太基本了?只是一个想法!我希望看到一个isFile()方法出现在CF中。如果他们有isImageFile和isPDFFile,我们当然可以有isFile:)!我不认为你正在寻找的选择存在。虽然我同意应该有一些东西。在java中,如何在
finally
子句中关闭文件流而不添加难看的try/catch,也会遇到类似的问题。Apache的方法是创建一个方法。比起使用
IsFile
方法,我更喜欢这个想法。至少在这个特定场景中..例如,如果FileClose方法接受了第二个参数
FileClose(object,throwOnError)
@Leigh Good point。现在,您可以编写一个像
FileCloseSilent(object)
这样的包装器,并在其内部执行
FileClose
try/catch,无论结果如何。实际上,我相信它使用的是
RandomAccessFile
。同意在需要时使用java没有什么错。我怀疑“黑客”评论是关于本机函数中的漏洞,而不是一般避开java;)就基本的文件处理而言,上面的场景是非常典型的。因此,虽然可以使用java,但如果CF要提供本机文件处理功能,它确实应该提供一种方法来处理整个循环—本机。就我的$0.02.。不使用cf的内置方法的一个缺点是,在使用反射时从cf调用java方法会增加一点成本
if (isFile(file)){
    fileClose(file);
}
 /* Detect CF's fileOpen() */
if (typeOf(theFile) is "fileHandler"){
    fileClose(file);

/* Detect createobject("java","java.io.FileReader") */
else if (typeOf(theFile) is "fileHandlerJava"){
    variables['file'].close();
}