¿Cómo obtengo el contenido de una cadena menos la extensión en ColdFusion?

StackOverflow https://stackoverflow.com/questions/215183

  •  03-07-2019
  •  | 
  •  

Pregunta

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 obtengo eso?

¿Fue útil?

Solución

Utilice las funciones de Lista a su favor.

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

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

<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 un poco más las cosas:Es posible que haya archivos que comiencen con un punto.Es posible que haya nombres de archivos que contengan muchos puntos adyacentes.Las funciones de lista devuelven resultados incorrectos, ya que ignoran los elementos de lista vacíos.También puede haber archivos que tengan puntos, pero sin extensión.Estos solo se pueden manejar si proporciona una lista blanca de extensiones: ListFindNoCase(FileExt, "doc,xls,ppt,jpg").Si desea tener en cuenta todo esto, probablemente deba renunciar a una expresión regular:

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

Para dividir el nombre del archivo de la ruta, ColdFusion proporciona distintas funciones que también manejan las diferencias de plataforma: GetFileFromPath() y GetDirectoryFromPath()

Otros consejos

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

Sin embargo, aún puede aprovechar las funciones de la lista para su ventaja, incluso en estos escenarios.

Puede analizar fácilmente el archivo desde la ruta con

fullFileName=listLast(fieldname,"\/")

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

theFileName=listFirst(fullFileName,".") 

funcionará.

Si quieres asegurarte de que obtienes todo menos lo que está 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 busca.

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

o

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

Al igual que con la sugerencia de Tomalak, sin embargo, esto se desglosará en un nombre de archivo que carece de una extensión. Envolviendo esto en un <cfif listLen(fullFileName,".") GT 1> se tendrá en cuenta eso.

La solución aceptada actual no funcionará para un archivo que no contenga una extensión.

Puede resolver esto utilizando una expresión regular para quitar la extensión solo si existe:

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


Es posible que esto no sea perfecto, es posible que tenga un archivo que tenga un. pero no se considera una extensión: puede resolver esto mediante el uso de una lista de extensiones conocidas para eliminar o limitando cuánto tiempo aceptará una extensión (por ejemplo, hasta 5):

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

Por lo tanto, primero debe encontrar la posición de la última parada completa (podría haber más de una parada completa en el nombre de archivo completo). No creo que Coldfusion tenga una función de búsqueda que funcione al revés, así que primero invierta la cadena:

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

Si eso devuelve cero, entonces no tiene una parada completa en el nombre del archivo, así que maneje adecuadamente. De lo contrario ...

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

A partir de ColdFusion 9+ (quizás antes, pero no puedo verificar), el Se incluyó la biblioteca Apache Commons . Dentro de eso está org.apache.commons.io.FilenameUtils. Puede utilizar métodos dentro del límite 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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top