如何获取字符串的内容减去ColdFusion中的扩展名?

时间:2008-10-18 15:44:51

标签: coldfusion

例如,我只想要字段中文件的“文件名”。说我有myimage.jpg我只想显示“myimage”我怎么得到那个?

5 个答案:

答案 0 :(得分:8)

利用列表功能。

<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")。如果您想要解释所有这些问题,您可能需要重新签署一个reguar表达式:

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

要从路径中拆分文件名,ColdFusion提供了可处理平台差异的独特功能:GetFileFromPath()GetDirectoryFromPath()

答案 1 :(得分:6)

Tomalak的答案很好,但这可能会变得棘手。给定一个名为“mydoc.ver1.doc”(有效的Windows文件名)的文件,它是文件名,是扩展名?如果有文件路径怎么办?

即使在这些情况下,您仍然可以利用列表功能。

您可以使用

轻松解析路径中的文件
fullFileName=listLast(fieldname,"\/")

如果您认为文件名是点之前的所有内容,那么

theFileName=listFirst(fullFileName,".") 

会奏效。

如果你想确保你得到的东西除了最后一段时间后的东西,那么需要一点点诡计,但并不多。没有listAllButLast()函数(虽然CFLIB.org上可能存在这样的东西),但我有两种方法可以想到你想要的东西。

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

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

然而,与Tomalak的建议一样,这将打破缺少扩展名的文件名。将其包含在<cfif listLen(fullFileName,".") GT 1>中将说明这一点。

答案 2 :(得分:3)

当前接受的解决方案不适用于不包含扩展名的文件。

你可以通过使用正则表达式来解决这个问题,只有当它存在时才剥离它:

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


这可能仍然不完美 - 你可能有一个文件有一个。但它不被视为扩展名 - 你可以通过使用已剥离的已知扩展名列表来解决这个问题,或者通过限制你接受的扩展程序(例如最多5个)来解决这个问题:

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

答案 3 :(得分:1)

所以你首先需要找到最后一个fullstop的位置(完整文件名中可能有多个fullstop)。我不认为Coldfusion有一个向后工作的find函数,所以首先反转字符串:

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

如果返回零,则文件名中没有fullstop,因此请适当处理。否则......

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

答案 4 :(得分:1)

从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"