Wie bekomme ich den Inhalt eines Strings ohne die Erweiterung in ColdFusion?

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

  •  03-07-2019
  •  | 
  •  

Frage

Zum Beispiel möchte ich nur den "Dateinamen" eine Datei in einem Feld.Sagen, ich habe myimage.jpg ich möchte nur die Anzeige "myimage" Wie bekomme ich nur?

War es hilfreich?

Lösung

Verwenden Sie die Liste Funktionen zu Ihrem Vorteil.

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

Beachten Sie, dass dies nur für die Datei-Namen, die eigentlich haben eine Dateierweiterung (definiert als das, was nach dem letzten Punkt).Um es sicherer zu machen, ist Folgendes besser:

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

Kompliziert werden die Dinge ein bisschen weiter:Es kann Dateien, die mit einem Punkt beginnen.Es kann Dateinamen enthalten viele benachbarte Punkte.Liste der Funktionen geben falsche Ergebnisse, da Sie ignorieren leere Liste Elemente.Es kann auch sein, dass Dateien mit Punkten, aber ohne Erweiterung.Diese können nur behandelt werden, wenn Sie eine Erweiterung auf der weißen Liste: ListFindNoCase(FileExt, "doc,xls,ppt,jpg").Wenn Sie möchten, zur Konto für all dies, die Sie wahrscheinlich benötigen, um zurücktreten zu einem reguar Ausdruck:

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

Split Dateiname von Pfad, ColdFusion bietet verschiedene Funktionen, die auch behandeln, Unterschiede Plattform: GetFileFromPath() und GetDirectoryFromPath()

Andere Tipps

Tomalak Antwort ist gut, aber das kann schwierig werden. Bei einer Datei mit dem Namen „mydoc.ver1.doc“ (eineine gültiger Windows-Dateinamen), die der Dateiname und das ist die Erweiterung? Was, wenn es eine Filepath?

Sie können weiterhin die Liste Funktionen zu Ihrem Vorteil nutzen, aber auch in diesen Szenarien.

Sie können ganz einfach die Datei aus dem Pfad mit

parsen
fullFileName=listLast(fieldname,"\/")

Wenn Sie davon ausgehen, der Dateiname, alles vor dem Punkt ist, dann

theFileName=listFirst(fullFileName,".") 

funktioniert.

Wenn Sie wollen sicherstellen, dass Sie alles bekommen, aber was ist nach der letzten Periode, dann ein wenig Trickserei erforderlich ist, aber nicht viel. Es gibt keine listAllButLast() Funktion (obwohl so etwas könnte auf CFLIB.org vorhanden ist), aber es gibt zwei Möglichkeiten, wie ich denken kann, zu bekommen, was Sie wollen.

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

oder

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

Wie bei Tomalak Vorschlag, wird dies jedoch auf einem Dateinamen brechen, die eine Erweiterung fehlt. Wrapping dies in einem <cfif listLen(fullFileName,".") GT 1> wird macht das.

Die aktuelle akzeptierte Lösung wird nicht für eine Datei arbeiten, die eine Erweiterung nicht enthalten.

Sie können dieses Problem lösen, indem Sie einen regulären Ausdruck nur mit der Erweiterung abzustreifen, wenn es vorhanden ist:

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


Dies könnte noch nicht perfekt sein - Sie könnten eine Datei, die eine hat. aber es ist nicht eine Erweiterung betrachtet - Sie können dieses Problem lösen, indem entweder eine Liste der bekannten Erweiterungen mit Streifen oder durch eine Begrenzung, wie lange eine Erweiterung, die Sie akzeptieren (zum Beispiel bis zu 5):

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

So Sie zuerst die Position des letzten fullstop finden müssen (es könnte mehr als ein fullstop in den vollständigen Dateinamen sein). Ich glaube nicht, Coldfusion eine Suche-Funktion hat, die nach hinten arbeitet, so kehren die Zeichenfolge zuerst:

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

Wenn das Null zurück, dann haben Sie keine fullstop in den Dateinamen, so handhaben angemessen. Else ...

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

Wie von Coldfusion 9+ (vielleicht früher, aber ich kann nicht überprüfen), die Apache Commons Bibliothek aufgenommen wurde. Innerhalb das ist org.apache.commons.io.FilenameUtils. Sie können auf die Menge an Operationen in CF benötigten Methoden im Schnitt verwenden bis auf die gleichen (oder ähnliche) Ergebnisse zu erhalten.

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"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top