8

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

4

5 回答 5

10

使用列表功能对您有利。

<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(FileFullName, FileExtRe, "")>

为了从路径中分离文件名,ColdFusion 提供了不同的函数来处理平台差异:GetFileFromPath()GetDirectoryFromPath()

于 2008-10-18T16:40:21.717 回答
8

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 的建议一样,这将分解为缺少扩展名的文件名。将其包装在 a<cfif listLen(fullFileName,".") GT 1>中将说明这一点。

于 2008-10-19T15:36:50.100 回答
3

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

您可以通过使用正则表达式来解决此问题,仅当扩展存在时才去除它:

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


这可能仍然不完美 - 您可能有一个文件,其中包含 . 但它不被视为扩展 - 您可以通过使用已知扩展的列表来解决这个问题,或者通过限制您将接受的扩展多长时间(例如最多 5 个):

<cfset FileName = rereplace( FullFileName , '\.(jpg|png|gif|bmp)$' , '' ) />
<cfset FileName = rereplace( FullFileName , '\.[^.]{1,5}$' , '' ) />
于 2008-10-18T18:45:16.893 回答
1

因此,您首先需要找到最后一个句号的位置(完整文件名中可能有多个句号)。我不认为 Coldfusion 有一个反向工作的查找功能,所以先反转字符串:

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

如果返回零,则文件名中没有句号,因此请适当处理。别的 ...

<cfset Filename = Left(FullFileName, Len(FullFileName) - Position>
于 2008-10-18T16:48:08.737 回答
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"
于 2014-10-22T18:44:12.130 回答