java.io.IOException の考えられる理由は次のとおりです。「ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません」

StackOverflow https://stackoverflow.com/questions/131901

  •  02-07-2019
  •  | 
  •  

質問

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

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を使用して問題なくファイルをコピーできます。

私はまだこの問題が発生するマシンにアクセスできず、自分のマシンで問題を再現できないため、この例外の理由についてヒントを得るためにあなたに問い合わせます。

役に立ちましたか?

解決

targetPath とファイル名の間のパス内のディレクトリ区切り文字の調整がより重要になるため、これを試してください。

File targetFile = new File(targetPath, filename);

他のヒント

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

参考までに、ファイル名にコロン付きのタイムスタンプが付いているとき、つまり myfile_HH:mm:ss.csv コロンを削除すると問題が解決されました。

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

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();
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

見る public boolean createNewFile() 使用している方法の詳細については、をご覧ください。

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

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);
}

その後、問題を報告したユーザーにとってはうまくいきました。

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

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

ところで。ログは適切に設定されており、ログに記録されたパスは問題ないようでした。それについて言及しておらず申し訳ありませんでした。私はそれが当然だと思っていましたが、質問内のコードが不必要に複雑になっていることがわかりました。

役立つ回答をありがとうございました。

非常によく似たエラー: - "...java.io.IO例外:Tomcatのホーム設定がトレーニングバックスラッシュを持っていたとき、ファイル名、ディレクトリ名、またはボリュームラベルの構文は正しくありませんでした。

軽微な編集は次の場所で提案されました:- http://www.coderanch.com/t/556633/Tomcat/java-io-IOException-ファイル名ディレクトリ私のためにそれを修正しました。

完全パス内のファイル/フォルダー名に含まれる特殊文字をすべて削除します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top