18

次のコードを使用してファイルをコピーしようとしています。

File targetFile = new File(targetPath + File.separator + filename);
...
targetFile.createNewFile();
fileInputStream = new FileInputStream(fileToCopy);
fileOutputStream = new FileOutputStream(targetFile);
byte[] buffer = new byte[64*1024];
int i = 0;
while((i = fileInputStream.read(buffer)) != -1) {
    fileOutputStream.write(buffer, 0, i);
}

一部のユーザーでは、次のtargetFile.createNewFile例外が発生します。

java.io.IOException: The filename, directory name, or volume label syntax is incorrect
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)
    at java.io.File.createNewFile(File.java:850)

ファイル名とディレクトリ名は正しいようです。コピー コードが実行される前にディレクトリtargetPathの存在もチェックされ、ファイル名は次のようになります。AB_timestamp.xml

ユーザーは への書き込み権限を持っておりtargetPath、OS を使用して問題なくファイルをコピーできます。

私はマシンにアクセスできないため、これはまだ発生しており、自分のマシンで問題を再現することはできません。この例外の理由についてのヒントを求めてあなたに連絡します。

4

13 に答える 13

7

同じ問題が発生しました。書き込みアクセス許可と関係があると思います。c:\ に書き込もうとしたときにエラーが発生しましたが、 D:\ に変更するとすべて正常に機能しました。どうやらJavaにはシステムドライブへの書き込み権限がありませんでした(CにインストールされたWindows 7を実行しています:)

于 2010-04-25T09:56:31.627 に答える
7

targetPath と filename の間のパスに含まれるディレクトリ区切り文字の調整がより慎重に行われるため、これを試してください。

File targetFile = new File(targetPath, filename);
于 2008-09-25T15:01:04.857 に答える
2

これが私が使っているテストプログラムです

import java.io.File;
public class TestWrite {

    public static void main(String[] args) {
        if (args.length!=1) {
            throw new IllegalArgumentException("Expected 1 argument: dir for tmp file");
        }
        try  {
            File.createTempFile("bla",".tmp",new File(args[0]));
        } catch (Exception e) {
            System.out.println("exception:"+e);
            e.printStackTrace();
        }
    }
}
于 2011-02-07T12:53:47.527 に答える
1

そのディレクトリへの書き込みアクセス権があることを確認した後、別のディレクトリ (たとえば "C:\") にファイルを作成してみてください。それが機能する場合、ファイルのパス名が間違っています。

例外のコメントを見て、ファイルのパス名のすべての要素を変更してみてください。実験。結論を導き出します。

于 2008-09-25T07:45:53.483 に答える
0

targetPath がディレクトリであることを確認しますか、それともその名前のものが存在することを確認しますか? (ユーザーはオペレーティングシステムからコピーできると言っていますが、別のことを入力している可能性があります)。

targetPath はすでに File.separator で終わっていますか?

(ログに記録して、失敗した場合の targetPath と filename の値を教えていただけると助かります)

于 2008-09-25T07:28:52.337 に答える
0

おそらく問題は、ファイルをネットワーク経由で共有ドライブにコピーしていることですか? パスが \mypc\myshared フォルダーのようなものである場合、NFS を使用してファイルを書き込むときに Java に問題が発生する可能性があると思います。

この問題が発生するパスは何ですか?

于 2008-09-25T07:29:51.633 に答える
0

ログを追加して、ファイルが作成しようとしている名前とパスを正確に確認して、親がディレクトリであることを確認してください。

さらに、ループを使用する代わりにチャンネルを確認することもできます。;-)

于 2008-09-25T07:30:20.227 に答える
0

あなたは「一部のユーザー向け」と言っていますが、他のユーザーでも機能しますか? ここでの違いは何ですか?ユーザーは異なるマシンで異なるインスタンスを実行していますか?それとも、これは同時ユーザーにサービスを提供するサーバーですか?

後者の場合、どういうわけか並行性のバグだと思います.2つのスレッドチェックは、同時に WinNTFileSystem.createFileExclusively(Native Method) でファイルを作成しようとします。

OpenJDK ソースを見ると、createNewFile も createFileExclusively も同期されていないため、このブロックを自分で同期する必要がある場合があります。

于 2008-09-25T07:39:07.790 に答える
0

ファイルが既に存在する可能性があります。タイムスタンプの解像度が十分でない場合に発生する可能性があります。取得しているのは IOException であるため、権限の問題ではない可能性があります (その場合、SecurityException が発生します)。

ファイルを作成する前にまずファイルの存在を確認し、何が起こっているかをログに記録します。

使用しているメソッドの詳細については、public boolean createNewFile()を参照してください。

于 2008-09-25T09:29:00.333 に答える
0

自分のマシンでエラーを再現することも、コードが失敗したユーザーのマシンを手に入れることもできなかったため、今まで受け入れられた回答を宣言するのを待ちました。コードを次のように変更しました。

File parentFolder = new File(targetPath);
... do some checks on parentFolder here ...
File targetFile = new File(parentFolder, filename);
targetFile.createNewFile();
fileInputStream = new FileInputStream(fileToCopy);
fileOutputStream = new FileOutputStream(targetFile);
byte[] buffer = new byte[64*1024];
int i = 0;
while((i = fileInputStream.read(buffer)) != -1) {
    fileOutputStream.write(buffer, 0, i);
}

その後、問題を報告しているユーザーのために機能しました。

したがって、アレクサンダーの答えはうまくいったようです-私は実際には彼が与えたものとはわずかに異なるコンストラクターを使用していますが、同じ線に沿っています。

古いバージョンをもう一度実行して、まだ失敗するかどうかを確認することで、コードの変更によってエラーが修正されたことを確認するのを手伝うように、そのユーザーに話しかける必要があります (別のことを行うのではなく)。

ところで。ロギングが行われ、ログに記録されたパスは問題ないように見えました-それについて言及しなかったことをお詫びします。私はそれを当然のことと考え、問題のコードを不必要に複雑にしていることがわかりました。

役立つ回答をありがとう。

于 2008-10-15T09:22:21.170 に答える
0

非常によく似たエラー:- "... java.io.IOException: ファイル名、ディレクトリ名、またはボリューム ラベルの構文が正しくありません" が Eclipse で生成されたのは、TOMCAT ホーム設定にトレーニング バックスラッシュが含まれていた場合です。

で提案されたマイナーな編集:- http://www.coderanch.com/t/556633/Tomcat/java-io-IOException-filename-directory で修正されました。

于 2012-11-30T10:50:05.597 に答える