ColdFusionで文字列の内容から拡張子を引いたものを取得するにはどうすればよいですか?
-
03-07-2019 - |
質問
たとえば、<!> quot; filename <!> quot;フィールド内のファイルの。 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")
を指定した場合にのみ処理できます。これらすべてを考慮したい場合、おそらく次の式に辞任する必要があります。
<cfset FileExtRe = "(?:\.(?:doc|xls|ppt|jpg))?$">
<cfset FileName = REReplaceNoCase(FileExtRe, FileFullName, "")>
パスからファイル名を分離するために、ColdFusionはプラットフォームの違いも処理する個別の関数を提供します:GetFileFromPath()
およびGetDirectoryFromPath()
他のヒント
Tomalakの答えは良いですが、これには注意が必要です。 <!> quot; mydoc.ver1.doc <!> quotという名前のファイルがあるとします。 (有効なWindowsファイル名)ファイル名と拡張子はどれですか?ファイルパスがある場合はどうなりますか?
ただし、これらのシナリオであっても、リスト機能を活用することはできます。
パスからファイルを簡単に解析できます
fullFileName=listLast(fieldname,"\/")
ファイル名がドットの前にあると仮定した場合、
theFileName=listFirst(fullFileName,".")
動作します。
最後の期間を過ぎたものを除くすべてを確実に取得したい場合は、少しのトリックが必要ですが、それほど多くは必要ありません。 listAllButLast()
関数はありません(CFLIB.orgにはそのようなものが存在する可能性があります)が、目的を達成するために考えられる2つの方法があります。
fileName=reverse(listRest(reverse(fullFileName),"."))
または
fileName=listDeleteAt(fullFileName,listLen(fullFileName,"."),".")
ただし、トマラックの提案と同様に、これは拡張子のないファイル名に分類されます。これを<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"