例如,我只想要字段中文件的“文件名”。说我有myimage.jpg我只想显示“myimage”我怎么得到那个?
答案 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"