Come posso ottenere il contenuto di una stringa meno l'estensione in ColdFusion?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Ad esempio, voglio solo il " nomefile " di un file in un campo. Supponiamo di avere myimage.jpg Voglio solo visualizzare & Quot; myimage & Quot; Come ottengo proprio quello?

È stato utile?

Soluzione

Utilizza le funzioni Elenco a tuo vantaggio.

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

Tieni presente che questo funziona solo per i nomi di file che in realtà hanno un'estensione di file (che è definita come la cosa dopo l'ultimo punto). Per renderlo più sicuro, è meglio quanto segue:

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

Per complicare ulteriormente le cose: potrebbero esserci dei file che iniziano con un punto. Potrebbero esserci nomi di file che contengono molti punti adiacenti. Le funzioni di elenco restituiscono risultati errati per loro, poiché ignorano gli elementi di elenco vuoti. Potrebbero esserci anche file con punti, ma senza estensione. Questi possono essere gestiti solo se si fornisce una lista bianca di estensioni: ListFindNoCase(FileExt, "doc,xls,ppt,jpg"). Se si desidera rendere conto di tutto ciò, probabilmente è necessario dimettersi a un'espressione regolare:

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

Per dividere il nome del file dal percorso, ColdFusion fornisce funzioni distinte che gestiscono anche le differenze della piattaforma: GetFileFromPath() e GetDirectoryFromPath()

Altri suggerimenti

La risposta di Tomalak è buona, ma può essere complicata. Dato un file chiamato & Quot; mydoc.ver1.doc & Quot; (un nome file Windows valido) qual è il nome file e qual è l'estensione? Cosa succede se esiste un percorso file?

Puoi comunque sfruttare le funzioni dell'elenco a tuo vantaggio, tuttavia, anche in questi scenari.

Puoi facilmente analizzare il file dal percorso con

fullFileName=listLast(fieldname,"\/")

Se si assume che il nome file sia tutto prima del punto, quindi

theFileName=listFirst(fullFileName,".") 

funzionerà.

Se vuoi assicurarti di ottenere tutto tranne quello che è dopo l'ultimo periodo, allora è necessario un piccolo trucco, ma non molto. Non esiste una funzione listAllButLast() (sebbene una cosa del genere possa esistere su CFLIB.org) ma ci sono due modi in cui posso pensare di ottenere quello che stai cercando.

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

o

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

Come per il suggerimento di Tomalak, tuttavia, questo verrà suddiviso in un nome file privo di estensione. Se lo avvolgi in <cfif listLen(fullFileName,".") GT 1> lo spiegherai.

L'attuale soluzione accettata non funzionerà per un file che non contiene un'estensione.

Puoi risolverlo usando un'espressione regolare per eliminare l'estensione solo se esiste:

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


Questo potrebbe non essere ancora perfetto - potresti avere un file che ha un. ma non è considerata un'estensione: puoi risolverlo utilizzando un elenco di estensioni conosciute da eliminare o limitando la durata di accettazione di un'estensione (ad es. fino a 5):

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

Quindi devi prima trovare la posizione dell'ultimo fullstop (potrebbe esserci più di un fullstop nel nome file completo). Non penso che Coldfusion abbia una funzione find che funziona all'indietro, quindi prima inverti la stringa:

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

Se questo restituisce zero, allora non hai un fullstop nel nome del file, quindi gestisci in modo appropriato. Altrimenti ...

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

A partire da ColdFusion 9+ (forse prima, ma non posso verificarlo), Apache Commons è stata inclusa. All'interno di questo è org.apache.commons.io.FilenameUtils. È possibile utilizzare i metodi all'interno della riduzione della quantità di operazioni necessarie in CF per ottenere gli stessi (o simili) risultati.

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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top