¿Cómo sé si esta variable es un identificador de archivo?

Digamos que tengo este código:

function doFileStuff(){
    var file = "";
    try {
        file = fileOpen(filePath);
        // do stuff with file
    }
    finally {
        fileClose(file);
    }
}

Si fileOpen() el proceso falla, el fileClose() la llamada dará error. Lo que tengo que hacer es este tipo de cosas (pseudocódigo):

if (isFile(file)){
    fileClose(file);
}

Sé que puedo probar si el archivo todavía es una cadena vacía, y esto me funciona aquí, pero no está probando lo que debería estar probando: si file es un identificador de archivo. Puedo verificar la clase Java del objeto, pero esto nuevamente me suena un poco extraño, y debería haber una forma CFML de hacerlo.

Debería haber algo como simplemente isFile(), no debería allí? No puedo encontrar nada como esto en los documentos.

¿Alguna idea/consejo? He profundizado más en mis investigaciones sobre mi blog. es demasiado prolijo para aquí.

preguntado el 27 de julio de 12 a las 17:07

Adam, ¿podrías usar una de las claves devueltas para el controlador de archivos para probar si es "real" o no? ¿Quizás algo como if(file.size > 0){ // haz lo tuyo}? Mi sensación es que si file.size devuelve un valor positivo, probablemente sea un archivo real. ¿Quizás eso es demasiado básico para sus necesidades? ¡Solo un pensamiento! -

Y ME ENCANTARÍA ver aparecer un método isFile() en CF en el futuro. Si tienen isImageFile e isPDFFile, ¡ciertamente podemos tener isFile :)! -

No creo que exista la opción que buscas. Aunque estoy de acuerdo en que debería haber algo. Te encuentras con problemas similares en Java con la forma de cerrar un flujo de archivos en un finally cláusula sin agregar un feo try/catch. El enfoque de Apache fue crear un cerrarEn silencio método. Me gusta más esa idea que una IsFile método. al menos en esto soluciones escenario .. -

es decir, por ejemplo, si el método FileClose acepta un segundo parámetro FileClose( object, throwOnError ) -

@Leigh Buen punto. Por ahora puedes escribir un contenedor como FileCloseSilent(object) y realizar FileClose intente / atrape dentro de él, cualquiera que sea el resultado. -

3 Respuestas

problema interesante usaría el java.io.File clase. Es lo que CF usa internamente para sus operaciones con archivos, con la excepción de la nueva función vfs.

Aprovechar Java no debe considerarse pirateado. A veces es una necesidad absoluta ;-)

Respondido 09 ago 12, 15:08

En realidad creo que usa RandomAccessFile. De acuerdo, no hay nada de malo en usar Java, cuando sea necesario. Sospecho que el comentario "hacky" fue sobre la brecha en las funciones nativas, en lugar de evitar Java en general;) El escenario anterior es bastante típico en lo que respecta al manejo básico de archivos. Entonces, si bien uno podría usar Java, si CF va a proporcionar funciones nativas de manejo de archivos, realmente debería proporcionar una forma de manejar el completar ciclo - de forma nativa. Solo mis $0.02.. - Leigh

Una de las desventajas de no usar los métodos incorporados de cf es que cuesta un poco más llamar a los métodos java desde cf ya que usa la reflexión. - mike causante

Estoy marcando esto como respondido: básicamente no hay una forma nativa de hacerlo. He planteó un ticket con Adobe para arreglarlo.

Gracias por todos los comentarios.

ACTUALIZACIÓN: Según ese ticket que planteé, esto se ha implementado como isFileObject() en ColdFusion 11.

Respondido el 20 de Septiembre de 13 a las 15:09

Expandí la funcionalidad de un UDF TypeOf() existente para agregar soporte para devolver cualquier tipo de variable. Puede usarlo para determinar si la variable es del tipo "FileHandler" (o "FileHandlerJava") y luego cerrarla según corresponda. Funciona con ColdFusion 9+. Publico esta solución porque no estamos actualizando a CF11.

TypeOf() UDF (y uso de muestra)

https://gist.github.com/JamoCA/1ed396431dfb8e0e9f58

 /* 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();
}

Respondido el 06 de enero de 16 a las 15:01

Divulgación completa: su cuenta de github - Dibujó

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.