5

私のWebアプリケーションはWindowsで実行されます。Linuxでもアプリを実行したいと思います。パス区切り文字などの問題のほとんどを克服したようです。

現在の本当の問題はFileNotFoundException、Javaコードがファイルを開こうとしたAbc.txtときに、存在する場合にのみ発生するということabc.txtです。:(

たくさんのファイルがあるので、すべてのファイル名を小文字または大文字に変更することはできません。コードをあまり変更せずに、これを回避するための可能な方法はありますか?

4

7 に答える 7

4

修理する!

修正を回避するために考案したスキームは、長期的には悪化します。

于 2009-11-14T09:50:30.263 に答える
3

java.io.FileAPIはシステムに依存するため、これを回避する方法はありません。Linux / Unixでファイルを操作するときは、正しいケースを使用する必要があります。実際、私のアドバイス/解決策は、Windowsでの開発中は、厳密で移植性のある規則に従うことです(たとえば、小文字のファイル名のみを使用するか、プログラムでアクセスする場合は正確なファイル名を使用することをお勧めします)。Abc.txt正直なところ、ファイル名が。のときになぜロードしようとしているのかわかりませんabc.txt。これは、Linux / Unixの問題というよりも、悪い習慣です(Windowsに多くの時間を費やすことによって教えられます)。

于 2009-11-14T09:27:51.477 に答える
2

まず、回避策を使用するのではなく、一貫した命名スキームに移行することを検討する必要があると思います。

とにかく、すべてのファイル名を読み込んで、小文字の名前をキーとして含むマップにそれらを配置するのはどうですか?次に、マップから正しいファイル名を検索できます。

これにより、競合を検出することもできます。たとえば、同じディレクトリにある同じ小文字の表現を持つ2つのファイル「FileA.txt」と「FILEA.TXT」の場合、問題に取り組む必要があることがわかります。完全に異なる方法(どちらを開きたいかを知る必要があり、それがあいまいであり、そのような回避策ではそれができないため)。

于 2009-11-14T09:27:21.583 に答える
1

Linux ではファイルに大文字と小文字が混在していると仮定すると、これに対する簡単な答えはありません。

私が考えることができる最善の方法は、アプリケーションに関連するディレクトリをリストさせ、実際の Linux ファイル名のメモリ内データ構造を作成することです。次に、大文字と小文字を区別しないファイルを開くには、パス名をコンポーネントに分割し、大文字と小文字を区別しない検索を使用してメモリ内ツリーを検索し、実際の (大文字と小文字を区別する) パス名を作成し、THAT を使用してファイルを開きます。

これに関する問題は、同じ Linux ディレクトリに "foo.txt" と "Foo.txt" がある (たとえば) ケースに (そして実際にあなたのアプリが) 対処できないことです。

しかし、最善の解決策は、大文字と小文字を区別するパス名で動作するようにアプリケーションを変更することです。

于 2009-11-14T09:31:40.830 に答える
1

多くのファイルを変更できないのはなぜですか? ファイルの量だけが問題である場合は、すべてのファイルの名前を小文字に変更する小さなスクリプトを作成するだけです。

于 2009-11-14T10:10:35.343 に答える
0

あなたの質問から、何があなたのファイルの大文字小文字の変更を引き起こしているのかは明らかではありません。Linuxではすべてのファイルが小文字であり、Windowsでは大文字と小文字が混在している場合は、次のようにファイル名を小文字に変換できます。

new File(filename.toLowerCase())
于 2009-11-14T09:25:14.150 に答える
0

恐ろしい実行時パフォーマンスを持つソリューションがありますが、実装は非常に簡単です。

new FileReader(name)次のようなものに置き換えます

openFile(name);

public FileReader openFile(String name) throws FileNotFoundException {
  File dir = (new File(name)).getParentFile();
  for (File f : dir.listFiles()) {
    if (f.getName().equalsIgnoreCase(name)) {
    return new FileReader(f);
  }
  throw new FileNotFoundException("File not found: " + name);
}

このコードはコンパイルしていません。タイプミスやバグがある可能性があります。修正はあなたに任せます。

于 2009-11-14T09:37:18.893 に答える