Как получить содержимое строки без расширения в ColdFusion? - PullRequest
7 голосов
/ 18 октября 2008

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

Ответы [ 5 ]

8 голосов
/ 18 октября 2008

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

<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()

6 голосов
/ 19 октября 2008

Томалак ответит хорошо, но это может быть сложно. Имеется файл с именем «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>, мы это учтем.

3 голосов
/ 18 октября 2008

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

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

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


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

<cfset FileName = rereplace( FullFileName , '\.(jpg|png|gif|bmp)$' , '' ) />
<cfset FileName = rereplace( FullFileName , '\.[^.]{1,5}$' , '' ) />
1 голос
/ 22 октября 2014

Начиная с 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"
1 голос
/ 18 октября 2008

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

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

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

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