Как мне получить содержимое строки без расширения в ColdFusion?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Например, я хочу просто указать "имя файла" файла в поле.Допустим, у меня есть myimage.jpg Я хочу отобразить только "myimage", Как мне получить именно это?

Это было полезно?

Решение

Используйте функции List в своих интересах.

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

Имейте в виду, что это работает только для имен файлов, которые на самом деле имеют расширение файла (которое определяется как вещь после последней точки). Чтобы сделать это безопаснее, лучше следующее:

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

Чтобы усложнить ситуацию немного дальше: могут быть файлы, начинающиеся с точки. Могут быть имена файлов, которые содержат много смежных точек. Функции списка возвращают неправильные результаты для них, поскольку они игнорируют пустые элементы списка. Также могут быть файлы с точками, но без расширения. Они могут быть обработаны, только если вы предоставите белый список расширений: ListFindNoCase(FileExt, "doc,xls,ppt,jpg"). Если вы хотите учесть все это, вам, вероятно, нужно подать заявление в регулярное выражение:

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

Чтобы отделить имя файла от пути, ColdFusion предоставляет различные функции, которые также обрабатывают различия платформы: GetFileFromPath() и GetDirectoryFromPath()

Другие советы

Ответ Томалака хорош, но это может оказаться непростым делом.Учитывая файл с именем "mydoc.ver1.doc" (допустимое имя файла Windows), какое имя файла и какое расширение?Что, если есть путь к файлу?

Однако даже в этих сценариях вы все равно можете использовать функции списка в своих интересах.

Вы можете легко разобрать файл по пути с помощью

fullFileName=listLast(fieldname,"\/")

Если вы предполагаете, что имя файла - это все, что стоит перед точкой, то

theFileName=listFirst(fullFileName,".") 

будет работать.

Если вы хотите быть уверенным, что получите все, кроме того, что будет после последнего периода, тогда потребуется небольшая хитрость, но не большая.Здесь нет ни одного listAllButLast() функция (хотя такая вещь может существовать в CFLIB.org), но есть два способа, которые я могу придумать, чтобы получить то, что вам нужно.

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

или

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

Однако, как и в случае с предложением Томалака, это будет разбито на имя файла, у которого отсутствует расширение.Заворачиваем это в <cfif listLen(fullFileName,".") GT 1> буду учитывать это.

Текущее принятое решение не будет работать для файла, который не содержит расширения.

Вы можете решить эту проблему, используя регулярное выражение для удаления расширения, только если оно существует:

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


Это все еще может быть не идеально - возможно, у вас есть файл, в котором есть .но это не считается расширением - вы можете решить эту проблему либо с помощью списка известных расширений для strip, либо ограничив продолжительность расширения, которое вы будете принимать (напримердо 5):

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

Итак, сначала вам нужно найти позицию последнего полного останова (в полном имени файла может быть более одного полного останова). Я не думаю, что Coldfusion имеет функцию поиска, которая работает в обратном направлении, поэтому сначала переверните строку:

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

Если это возвращает ноль, то у вас нет точки останова в имени файла, поэтому обращайтесь с ним соответствующим образом. Остальное ...

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

Начиная с ColdFusion 9+ (возможно, раньше, но я не могу проверить), Библиотека Apache Commons была включена. Внутри это org.apache.commons.io.FilenameUtils. Вы можете использовать методы для сокращения количества операций, необходимых в CF, чтобы получить те же (или похожие) результаты.

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"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top