Como faço para obter o conteúdo de uma string menos a extensão no ColdFusion?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Por exemplo, eu quero apenas o "nome" de um arquivo em um campo. Digamos que eu tenha myimage.jpg Eu só quero mostrar "myimage" Como faço para obter apenas isso?

Foi útil?

Solução

Use a lista de funções para a sua vantagem.

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

Esteja ciente de que isso só funciona para nomes de arquivos que realmente Have uma extensão de arquivo (que é definida como a coisa após o último ponto). Para torná-lo mais seguro, o seguinte é melhor:

<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 coisas complicar um pouco mais longe: pode haver arquivos que começam com um ponto. Pode haver nomes de arquivos que contêm muitos pontos adjacentes. funções de lista retornar resultados errados para eles, como eles ignoram os elementos da lista vazias. Também pode haver arquivos que possuem pontos, mas nenhuma extensão. Estes só podem ser tratados se você fornecer uma lista branca de extensão: ListFindNoCase(FileExt, "doc,xls,ppt,jpg"). Se você quiser conta para tudo isso, você provavelmente terá que renunciar a uma expressão reguar:

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

Para nome do arquivo de divisão do caminho, ColdFusion fornece funções distintas que também lidar com diferenças de plataforma: GetFileFromPath() e GetDirectoryFromPath()

Outras dicas

A resposta de Tomalak é bom, mas isso pode ficar complicado. Dado um arquivo chamado "mydoc.ver1.doc" (um nome válido arquivo Windows) que é o nome do arquivo e qual é a extensão? E se há um caminho de arquivo?

Você ainda pode aproveitar as funções de listagem para a sua vantagem, no entanto, mesmo nesses cenários.

Você pode facilmente analisar o arquivo do caminho com

fullFileName=listLast(fieldname,"\/")

Se você assumir o nome do arquivo é tudo antes do ponto, em seguida,

theFileName=listFirst(fullFileName,".") 

vai funcionar.

Se você quiser garantir que você obtenha tudo, mas o que é após o último período, em seguida, é necessário um pouco de artifícios, mas não muito. Não é uma função listAllButLast() (embora tal coisa pode existir em CFLIB.org), mas há duas maneiras que eu posso pensar para obter o que você está depois.

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

ou

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

Tal como acontece com a sugestão de Tomalak, no entanto, isso vai quebrar em um nome de arquivo que não tem uma extensão. Envolvendo isso em um <cfif listLen(fullFileName,".") GT 1> serão responsáveis ??por isso.

A solução aceita atual não vai funcionar para um arquivo que não contém uma extensão.

Você pode resolver isso usando uma expressão regular para retirar a extensão apenas se ele existir:

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


Isso ainda pode não ser perfeito - você pode ter um arquivo que tem um. mas não é considerada uma extensão - você pode resolver isso usando uma lista de extensões conhecidos a faixa, ou limitando a duração de uma extensão que vai aceitar (por exemplo até 5):

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

Então, primeiro você precisa para encontrar a posição do último fullstop (pode haver mais de um fullstop no nome do arquivo completo). Eu não acho que Coldfusion tem uma função find que funciona para trás, assim reverter a seqüência de primeira:

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

Se que retorna zero, então você não tem um fullstop no nome do arquivo, assim que lidar de forma adequada. Else ...

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

A partir do ColdFusion 9 + (talvez mais cedo, mas eu não posso verificar), a Apache Commons biblioteca foi incluído. Dentro desse é org.apache.commons.io.FilenameUtils. Você pode utilizar métodos dentro da reduzir a quantidade de operações necessárias na CF para obter os mesmos (ou similares) resultados.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top