2013-07-16 5 views
5

ファイル名から拡張子を抽出する必要があります。tar.gzのような特別な場合のファイル拡張子を取得

私は、これはfilePath.lastIndexOf('.')を使用してまたはApache Commonsの-IOからFilenameUtils.getExtension(filePath)のようなユーティリティメソッドを使用して.gzまたは.tarのような単一の拡張のために行うことができます知っています。

ただし、の場合、.tar.gzのような拡張子のファイルがあるとどうなりますか? .文字を含む拡張子を持つファイルを管理するにはどうすればよいですか?

+4

実際には、拡張子は '.tar.gz 'ではありません。拡張子 - 定義によって - は '.gz'です。 '.tar'部分は情報提供のためのものです。ファイルが '.test.zip'で終わった場合は、拡張子' .zip'とみなされますね。 –

+1

と 'commons-io-2.4.jar'はこの場合、あなたが期待するものでしょうか? – vels4j

+0

@ThorstenDittmar * .tarzのように、* .tar.gzを扱うのはまだ妥当です。 – Ingo

答えて

3

重要な拡張子がわかっている場合は、その拡張子を明示的に確認できます。

List<String> EXTS = Arrays.asList("tar.gz", "tgz", "gz", "zip"); 

あなたはこのような(最初の)最長一致する内線番号を得ることができます:あなたは、このような知られている拡張子のコレクションを持っているでしょう

String getExtension(String fileName) { 
    String found = null; 
    for (String ext : EXTS) { 
    if (fileName.endsWith("." + ext)) { 
     if (found == null || found.length() < ext.length()) { 
     found = ext; 
     } 
    } 
    } 
    return found; 
} 

のでgetExtension("file.tar.gz")を呼び出すと"tar.gz"を返します。

大文字と小文字が混在している場合は、ループ内のチェックをfilename.toLowerCase().endsWith("." + ext)に変更してみてください。

0

簡単な方法が見つかりました。ファイル名のみを取得する場合はsubstringを、lastIndexOfではなくindexOfを使用して最初に '。'を取得してください。それ以降の拡張

+2

それで 'program.logs.tar.gz'というファイルをあなたのプログラムに与えたら、あなたのプログラムはその拡張をどのように考えますか? –

+0

同意すると、バージョン番号などのファイルが埋め込まれている場合、この機能は動作しません。 – grkvlt

0

パスのファイル名部分を得て、.に分割し、配列内の最後の0,1、または2要素を拡張子として使用できます。

もちろん、.tar.*(gz、bz2など)が唯一のケースであれば、.tarのファイル名をフィルタリングするソリューションを構築するのは実用的かもしれません。それを拡張子を抽出するポイント(.tar部分を含む)として使用します。

2

ファイルの拡張子は1つだけです。

ファイルtest.tar.gzを持っている場合は、

  • .gzは、拡張子と
  • test.tarでベース名です!

.tarはこの場合、拡張子の一部ではなく、ベース名の一部です!

targzのようにエンコードされたファイルをお持ちの場合は、.tgzとしてください。 .tar.gzを使用するのは悪い習慣です.sseファイルを処理する必要がある場合は、ファイルの名前をtest.tgzに変更するなどの対応策を講じてください。

+1

別れよう:「拡張子」は、アプリケーションによって定義されているものです。 OSの観点からは、「拡張」というものはありません。 – Ingo

+0

OS pov、hm ...おそらくFS povから言いたいことはありません。 –

関連する問題