1

ファイル(またはディレクトリ)の名前を変更するこのJavaコードがあります。Linuxでいくつかの特殊文字を使用すると問題が発生しますが、Windowsではこれらの特殊文字で動作します。私が試してみる方法は次のとおりです。Windowsの場合

  • 「326½_6」というディレクトリを作成します

  • jarファイルを作成し、それをWindows cmd(またはlinuxシェル)で直接呼び出します(java -jar)。最初のparamは上のディレクトリで、2番目のparamは新しいディレクトリへのパスです。これは動作します

次に、SFTP(WinSCP)を使用してディレクトリをLinuxサーバーに転送します。上記の手順を繰り返しますが、機能しません。私はこの出力を取得します:

/ home / user /testarea/326�_6/を/home/ user / testarea /test5/に移動します

---名前の変更を実行できませんでした-------

Linuxマシンでこれを機能させる方法はありますか?

コード:

  public static void main(String [] args) {
    String source = args[0];
    String dest = args[1];
    System.out.println(" - Moving " + source + " to " + dest);

    File sourceFile = new File(source);
    File destinationFile = new File(dest);

    if (!sourceFile.renameTo(destinationFile)) {
        System.out.println("--- could not perform rename -------");
    }

    System.out.println("Finished moving");
 }

ありがとう!

4

3 に答える 3

2

Linux上のJavaは、ファイル名とディレクトリ名がUTF-8でエンコードされることを期待しているようですが、WinSCPがディレクトリを作成すると、名前はlatin1などでエンコードされ、新しい名前はUTF-8では無効になります。どうやらこれはWinSCPのデフォルトの動作であり、新しいバージョンはデフォルトでUTF-8を使用します

ディレクトリの作成時にSFTPが使用したのと同じエンコーディングをJavaに使用させる簡単なソリューション。これは、JVMの実行時にロケールを変更することによって行われます。

LANG=en_US.iso8859_1 java -jar YourProgram.jar

ただし、これが機能するには、ロケールen_US.iso8859_1が存在する必要があります。ディストリビューションのパッケージリポジトリから新しいロケールをインストールできる場合があります。そうでない場合は、私のブログで特定のエンコーディングを使用してロケールを定義する方法(およびこのファイル名の問題全般)について読むことができます。

于 2012-10-24T15:09:08.247 に答える
1

ファイルソースが存在しない可能性があります。renameToの前に存在を確認してください

于 2012-10-24T09:45:49.603 に答える
0

renameTo()は、特にWindowsだけでなく、UNIXライクなシステムでもまったく信頼できません。私が提案するのは、いくつかのチェックを実行し、いくつかの「再試行」メカニズムを作成して、この投稿を確認することです。使用しているエンコーディングを指定できますか(UTF-8と思われるタグを見て)、プログラムをどのように起動しますか?

于 2012-10-24T09:43:49.850 に答える