2008-10-18 29 views

回答

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")。如果要解釋這一切,你可能需要辭職到絡表達式:

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

從路徑拆分文件名,ColdFusion的提供不同的功能,也處理平臺的差異:GetFileFromPath()GetDirectoryFromPath()

1

所以你首先需要找到最後一個完整的位置(可能有多個完整的文件名)。我不認爲ColdFusion的具有查找功能是倒過來,所以首先扭轉字符串:

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

如果返回零,那麼你不必在文件名中一個句號,所以適當的處理。否則...

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

當前接受的解決方案對於不包含擴展名的文件不起作用。

您可以通過使用正則表達式,只有當它的存在是爲了剝離擴展解決這個問題:

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


這可能還不是完美的 - 你可能有,有一個文件。

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

託默勒格的回答是: - ,但它不被視爲一個擴展,你可以通過使用已知的擴展名的列表剝離,或通過限制你將延長多久接受(例如高達5)解決了這個好,但這可能會變得棘手。給定一個文件名爲「mydoc.ver1.doc」(一個有效的Windows文件名),它是文件名,它是擴展名?如果有文件路徑怎麼辦?

但是,即使在這些情況下,仍然可以充分利用列表功能。

您可以輕鬆地解析出從路徑的文件與

fullFileName=listLast(fieldname,"\/") 

如果假設文件名是點之前的所有內容,然後

theFileName=listFirst(fullFileName,".") 

會工作。

如果你想確保你得到的只是最後一段時間以後的事情,那麼就需要一點小小的詭計,但並不多。沒有一個listAllButLast()函數(儘管CFLIB.org上可能存在這樣的事情),但我可以通過兩種方式來獲得你想要的結果。

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

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

與託默勒格的建議,但是,這將打破上缺少擴展名的文件名。將其包裝在<cfif listLen(fullFileName,".") GT 1>將解決這個問題。

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" 
相關問題