2008-10-18 16 views
7

Por ejemplo, solo quiero el "nombre de archivo" de un archivo en un campo. Digamos que tengo myimage.jpg Solo quiero mostrar "myimage" ¿Cómo puedo obtener eso?¿Cómo obtengo el contenido de una cadena menos la extensión en ColdFusion?

+0

que idioma? – AnnaR

+0

Sí, es difícil de decir de la pregunta original. :) Cuando respondes, sin embargo, ves que está etiquetado como "fusión fría". – Pistos

+0

Sí, lo siento, estoy en Coldfusion. Recuerdo que había una función que me permitiría hacer algo como esto, pero no puedo encontrarlo. –

Respuesta

8

Utilice las funciones de Lista para su ventaja.

<cfset FileName = ListDeleteAt(FileFullName, ListLen(FileFullName, "."), ".")> 

Tenga en cuenta que esto sólo funciona para los nombres de archivo que en realidad tienen una extensión de archivo (que se define como la cosa después del último punto). Para hacerlo más seguro, lo siguiente es mejor:

<cfset ExtensionIndex = ListLen(FileFullName, ".")> 
<cfif ExtensionIndex gt 1> 
    <cfset FileExt = ListGetAt(ExtensionIndex , ".")> 
    <cfset FileName = ListDeleteAt(FileFullName, ExtensionIndex, ".")> 
<cfelse> 
    <cfset FileExt = ""> 
    <cfset FileName = FileFullName> 
</cfif> 

Para complicar las cosas un poco más: Puede haber archivos que comienzan con un punto. Puede haber nombres de archivo que contengan muchos puntos adyacentes. Las funciones de lista devuelven resultados incorrectos, ya que ignoran los elementos de la lista vacía. También puede haber archivos con puntos, pero sin extensión. Estos solo pueden manejarse si proporciona una lista blanca de extensión: ListFindNoCase(FileExt, "doc,xls,ppt,jpg"). Si quieres dar cuenta de todo esto, es probable que tenga que renunciar a una expresión reguar:

<cfset FileExtRe = "(?:\.(?:doc|xls|ppt|jpg))?$"> 
<cfset FileName = REReplaceNoCase(FileExtRe, FileFullName, "")> 

Para dividir nombre de archivo de ruta, ColdFusion proporciona funciones distintas que también se ocupan de diferencias de plataforma: GetFileFromPath() y GetDirectoryFromPath()

1

Por lo tanto, primero debe encontrar la posición del último tope (podría haber más de un tope completo en el nombre de archivo completo). No creo Coldfusion tiene una función de búsqueda que funciona al revés, por lo que invertir la primera cadena:

<cfset Position = Find(".", Reverse(FullFileName))> 

Si eso devuelve cero, entonces usted no tiene un fullstop en el nombre del archivo, lo que debe manipularse adecuadamente. Else ...

<cfset Filename = Left(FullFileName, Len(FullFileName) - Position> 
+0

BTW: a partir de ColdFusion MX, tiene acceso a las clases Java subyacentes. Llamar a 'FileFullName.lastIndexOf (".")' Es mucho más eficiente que hacer 'Find (' '' ', Reverse (FileFullName))'. – Tomalak

3

La solución aceptada actualmente no funcionará para un archivo que no contiene una extensión.

Puede resolver esto mediante el uso de una expresión regular para despojar a la extensión sólo si existe:

<cfset FileName = rereplace(FullFileName , '\.[^.]+$' , '') /> 


Esto todavía no puede ser perfecto - que podría tener un archivo que tiene una. pero no se considera una extensión - se puede resolver esto ya sea mediante el uso de una lista de extensiones conocidas a desnudarse, o mediante la limitación de la duración de una extensión que va a aceptar (por ejemplo, hasta 5):

<cfset FileName = rereplace(FullFileName , '\.(jpg|png|gif|bmp)$' , '') /> 
<cfset FileName = rereplace(FullFileName , '\.[^.]{1,5}$' , '') /> 
6

respuesta de Tomalak es bien, pero esto puede ser complicado. Dado un archivo llamado "mydoc.ver1.doc" (un nombre de archivo de Windows válido) ¿cuál es el nombre del archivo y cuál es la extensión? ¿Qué pasa si hay un archivo de ruta?

Sin embargo, aún puede aprovechar las funciones de la lista, incluso en estos casos.

puede analizar fácilmente el archivo de la ruta con

fullFileName=listLast(fieldname,"\/") 

Si usted asume el nombre del archivo es todo antes del punto, entonces

theFileName=listFirst(fullFileName,".") 

va a funcionar.

Si quiere asegurarse de obtener todo pero después del último período, entonces se necesita un pequeño truco, pero no mucho. No hay una función listAllButLast() (aunque tal cosa podría existir en CFLIB.org) pero hay dos maneras en que puedo pensar para obtener lo que buscas.

fileName=reverse(listRest(reverse(fullFileName),".")) 

o

fileName=listDeleteAt(fullFileName,listLen(fullFileName,"."),".") 

Al igual que con la sugerencia de Tomalak, sin embargo, esto se desintegrará en un nombre de archivo que no tiene una extensión. Envolver esto en un <cfif listLen(fullFileName,".") GT 1> representará eso.

1

A partir de ColdFusion 9+ (quizás antes, pero no puedo verificar), se incluyó la biblioteca Apache Commons. Dentro de eso está org.apache.commons.io.FilenameUtils. Puede utilizar métodos dentro de la reducción de la cantidad de operaciones necesarias en CF para obtener los mismos resultados (o similares).

filepath = "some/dir/archive.tar.gz"; 
oUtils = createObject("java", "org.apache.commons.io.FilenameUtils"); 

writeDump(oUtils.getFullPath(filepath)); // "some/dir/" 
writeDump(oUtils.getName(filepath)); // "archive.tar.gz" 
writeDump(oUtils.getBaseName(filepath)); // "archive.tar" 
writeDump(oUtils.getExtension(filepath)); // "gz" 
writeDump(oUtils.getPath(filepath)); // "some/dir/" 
writeDump(oUtils.getPathNoEndSeparator(filepath)); // "some/dir" 
Cuestiones relacionadas