Comment obtenir le contenu d'une chaîne moins l'extension dans ColdFusion?

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

  •  03-07-2019
  •  | 
  •  

Question

Par exemple, je veux seulement le " nom du fichier " d'un fichier dans un champ. Dites que j'ai myimage.jpg. Je souhaite uniquement afficher & Quot; myimage & Quot; Comment puis-je obtenir juste cela?

Était-ce utile?

La solution

Utilisez les fonctions de liste à votre avantage.

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

Sachez que cela ne fonctionne que pour les noms de fichier ayant en fait une extension de fichier (définie comme l'élément suivant le dernier point). Pour améliorer la sécurité, il est préférable de:

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

Pour compliquer les choses un peu plus loin: il peut y avoir des fichiers qui commencent par un point. Il peut y avoir des noms de fichiers contenant de nombreux points adjacents. Les fonctions de liste renvoient des résultats erronés car elles ignorent les éléments de liste vides. Il peut également y avoir des fichiers qui ont des points, mais aucune extension. Celles-ci ne peuvent être traitées que si vous fournissez une liste blanche d'extension: ListFindNoCase(FileExt, "doc,xls,ppt,jpg"). Si vous souhaitez prendre en compte tout cela, vous devrez probablement vous résigner à une expression régulière:

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

Pour séparer le nom de fichier du chemin d'accès, ColdFusion fournit des fonctions distinctes qui gèrent également les différences de plate-forme: GetFileFromPath() et GetDirectoryFromPath()

.

Autres conseils

La réponse de Tomalak est bonne, mais cela peut devenir compliqué. Étant donné un fichier nommé & Quot; mydoc.ver1.doc & Quot; (un nom de fichier Windows valide) qui est le nom de fichier et quelle est l'extension? Et s'il y a un chemin de fichier?

Vous pouvez néanmoins utiliser les fonctions de liste à votre avantage, même dans ces scénarios.

Vous pouvez facilement analyser le fichier à partir du chemin d'accès avec

fullFileName=listLast(fieldname,"\/")

Si vous supposez que le nom du fichier est tout ce qui se trouve avant le point, alors

theFileName=listFirst(fullFileName,".") 

fonctionnera.

Si vous voulez vous assurer que vous obtenez tout, sauf ce qui se passe après la dernière période, il vous faudra un peu de tromperie, mais pas beaucoup. Il n’existe pas de fonction listAllButLast() (bien qu’une telle chose puisse exister sur CFLIB.org), mais il ya deux façons de penser à ce que vous recherchez.

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

ou

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

Comme dans la suggestion de Tomalak, cependant, cela se décomposera sur un nom de fichier sans extension. Le fait d'envelopper ceci dans un <cfif listLen(fullFileName,".") GT 1> compte pour cela.

La solution acceptée en cours ne fonctionnera pas pour un fichier ne contenant pas d'extension.

Vous pouvez résoudre ce problème en utilisant une expression régulière pour supprimer l'extension uniquement si elle existe:

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


Cela peut encore ne pas être parfait - vous pourriez avoir un fichier qui a un fichier. mais ce n’est pas considéré comme une extension - vous pouvez résoudre ce problème en utilisant une liste d’extensions connues à supprimer, ou en limitant la durée de validité d’une extension que vous accepterez (par exemple jusqu’à 5):

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

Donc, vous devez d’abord trouver la position du dernier point d’arrêt complet (il peut y avoir plus d’un arrêt complet dans le nom de fichier complet). Je ne pense pas que Coldfusion ait une fonction de recherche qui fonctionne à l'envers, donc inversez d'abord la chaîne:

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

Si la valeur renvoyée est 0, le nom de fichier n’a pas d’arrêt complet. Sinon ...

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

À compter de ColdFusion 9+ (peut-être plus tôt, mais je ne peux pas vérifier), le La bibliothèque Apache Commons a été incluse. À l'intérieur de cela se trouve org.apache.commons.io.FilenameUtils. Vous pouvez utiliser des méthodes qui permettent de réduire le nombre d'opérations nécessaires dans CF pour obtenir les mêmes résultats (ou des résultats similaires).

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"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top