例如,我只想要字段中文件的“文件名”。假设我有 myimage.jpg 我只想显示“myimage” 我怎么得到这个?
5 回答
使用列表功能对您有利。
<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()
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>
中将说明这一点。
当前接受的解决方案不适用于不包含扩展名的文件。
您可以通过使用正则表达式来解决此问题,仅当扩展存在时才去除它:
<cfset FileName = rereplace( FullFileName , '\.[^.]+$' , '' ) />
这可能仍然不完美 - 您可能有一个文件,其中包含 . 但它不被视为扩展 - 您可以通过使用已知扩展的列表来解决这个问题,或者通过限制您将接受的扩展多长时间(例如最多 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"