2012-02-22 10 views
4

私たちはWindowsサーバー上でJavaコードを長年実行してきました。いくつかのFreeBSDボックスで同じコードを実行したいのですが、ファイル/パス名が大文字と小文字を区別しない環境で長くなってしまい、コードが壊れてしまいます。大文字と小文字を区別しないファイルシステムから大文字小文字を区別するアプリケーションにJavaアプリケーションを移動

私がやってみたいことは、FileやFileSystemやそれに類するトリックをサブクラス化して、すべてのファイル名を小文字にすることです(常時)。

新しいクラスのOurFileでFileを拡張すると、すべてが小文字になります。その後、OS上のすべてのファイル/フォルダを小文字に変換するスクリプトを実行し、バム、バグを押しつぶす。

新しいFileSystem実装での同様のハッキングのようにも良い結果が得られるようです。

私は、確かに私の前の誰かがこの問題に直面し、それをうまく舐めていたと思っていました。

だから、そこに知恵はありますか?このような大文字と小文字の区別の問題を解決する簡単で標準的な方法はありますか?お使いのファイルのアクセス方法は、クラス(のようなnew File(String filename))の少数を通過した場合

+0

大文字小文字の区別がない場合は、システム。試してみてください。http://www.brain-dump.org/projects/ciopfs/ – Jayan

+0

私はciopfsを見て、私たちの目的には十分に頑丈ではないと判断しました。ZFSは大文字と小文字を区別しないオプションを持っています...うまくいきましたが、いくつかのzfsツールに問題がありました/この小さなオプションを正しくサポートしていませんでした。 – SvrGuy

+0

しばらくの間、データをウィンドウに保存することは可能ですか?その場合は、ignore_caseを使ってウィンドウからデータをマウントし、アプリがどれくらい行くことができるかを確認してください。次にzfsのようなファイルsystmでコードを修正して、ジャーナリング、バックアップ復元などの機能が意思決定機能となる。大文字小文字の区別なし – Jayan

答えて

-2

(すなわちLowerCaseFileSystemForPortingWindowsToUnixを書かれた、誰かがファイルシステムを拡張し、など?それをテストしている)、その後、あなたはいくつかのコードここで織るためにAspectJのを使用することができるかもしれませんパスされたときのファイル名の大文字と小文字を変更します。

ような何か:

@Around(value = "newFile(context)", argNames = "point") 
public Object requiresNew(ProceedingJoinPoint point) throws Throwable { 

    String filename = (String) point.getArgs()[0]; 
    return point.proceed(new String[] { filename.toLowerCase() }); 
} 

これはおそらくFileを拡張するよりも、あなたのコードベースの多く控えめになり、プラスそれはあなたの出口戦略与える:これを通過した

  1. log.warn()すべてのファイル名を完全に小文字ではない
  2. 警告が発生したときに修正する
  3. 一度アスペクトを削除する
+0

何らかの理由でファイル名がいくつかのレジストリに保存されている場合ファイルシステムから新しく得られた名前との比較は失敗します。 これは、大文字を含む名前のファイルをポイントするために使用されている場合、アプリケーションのインストールであらかじめパッケージ化されているため、同じファイルが取得されません。これは、大文字と小文字の区別を考慮して一意の名前を持つ書き込みファイルを使用する場合にのみ機能します。 – MahdeTo

+0

この質問は、ファイルシステムから小文字のエントリを返すような方法を簡単にアスペクト化できるだけでなく、ファイル名の登録について言及していません。パッケージ化された大文字と小文字のファイル名ではうまく動作しないことに同意しますが、おそらく直接それらを検索して変更することができます。質問には、具体的には、「OSのすべてのファイル/フォルダを小文字にするスクリプトを実行する」 –

+0

最終的な追加が可能です。 – MahdeTo

0

あなたのコードを修正することを考えましたか?あなたの説明から、あなたはコード内で大文字小文字を区別しない(つまり、単純に言えば、間違った)名前のファイル/リソース参照をたくさん持っているようです...ファイル名を参照する方法にファイル名を適合させるかコード(コードに何らかの結果がある場合のみ、すべてのファイル名は小文字です)、ファイル名と一致するように定数をコードに適合させます。

java.ioクラスへのラップは、パス内のどこにでもすべてのファイル/ディレクトリをリストし、パスに一致する名前を見つけようとする必要があります。しかし、U ** xシステムでは、resourcesResourcesの両方のディレクトリを持つことができます。したがって、あなたはパス 'RESOURCES/IMAGES/MYIMAGE.PNG'のどちらを取るでしょうか?さらに、I/O操作のパフォーマンス上の問題が発生します。

私はこのようなプロジェクトを一度「固定」していますが、それは非常に小さいものでしたが、非常に迷惑でした。私の運については、単一のファイルのすべての定数を小文字と小文字のすべてのイメージファイル名などに変更するなど、いくつかの操作をスクリプト化することができます。

+0

コードベースは200万行以上です。さらに、すべてのファイル名はコードに含まれておらず、いくつかは構成ファイルやデータファイルなどにあります(そのうちの12 tbという値があります)。これは実用的なオプションではありません。 – SvrGuy

関連する問題