题
例如,我只想要<!> quot; filename <!>;字段中的文件。说我有myimage.jpg我只想显示<!> quot; myimage <!> quot;我怎么做到这一点?
解决方案
利用列表功能。
<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()
其他提示
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>
中将说明这一点。
当前接受的解决方案不适用于不包含扩展名的文件。
你可以通过使用正则表达式来解决这个问题,只有当它存在时才剥离它:
<cfset FileName = rereplace( FullFileName , '\.[^.]+$' , '' ) />
,点击 这可能仍然不完美 - 你可能有一个文件有一个。但它不被视为扩展名 - 你可以通过使用已剥离的已知扩展名列表来解决这个问题,或者通过限制你接受的扩展程序(例如最多5个)来解决这个问题:
<cfset FileName = rereplace( FullFileName , '\.(jpg|png|gif|bmp)$' , '' ) />
<cfset FileName = rereplace( FullFileName , '\.[^.]{1,5}$' , '' ) />
所以你首先需要找到最后一个fullstop的位置(完整文件名中可能有多个fullstop)。我不认为Coldfusion有一个向后工作的find函数,所以首先反转字符串:
<cfset Position = Find(".", Reverse(FullFileName))>
如果返回零,则文件名中没有fullstop,因此请适当处理。否则......
<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"