たとえば、フィールド内のファイルの「ファイル名」だけが必要です。myimage.jpg があるとします。「myimage」だけを表示したいのですが、どうすればそれを取得できますか?
5 に答える
List 関数を有利に使用します。
<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(FileFullName, FileExtRe, "")>
GetFileFromPath()
パスからファイル名を分割するために、ColdFusion には、プラットフォームの違いも処理する個別の関数が用意されています。GetDirectoryFromPath()
トマラクの答えは良いですが、これは難しい場合があります。「mydoc.ver1.doc」(有効な Windows ファイル名) という名前のファイルのファイル名と拡張子は? ファイルパスがある場合はどうなりますか?
ただし、これらのシナリオでもリスト関数を活用できます。
パスからファイルを簡単に解析できます
fullFileName=listLast(fieldname,"\/")
ファイル名がドットの前のすべてであると仮定すると、
theFileName=listFirst(fullFileName,".")
動作します。
最後の期間の後にあるもの以外のすべてを確実に取得したい場合は、少しのトリックが必要ですが、それほど多くはありません. 関数はありませんがlistAllButLast()
(CFLIB.org にはそのような関数が存在する可能性があります)、目的を達成するために考えられる方法が 2 つあります。
fileName=reverse(listRest(reverse(fullFileName),"."))
また
fileName=listDeleteAt(fullFileName,listLen(fullFileName,"."),".")
ただし、Tomalak の提案と同様に、これは拡張子のないファイル名ではうまくいきません。これを will にラップすると、<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>