0

私は自分のコードを最初に置きます:

@Post
public Representation post(InputStream zip) throws Throwable {
    createFile(zip, "C:/temp\abc.zip");
    return new StringRepresentation("File uploaded");
}    

public void createFile(InputStream zipStream, uploadedFileLocation) throws Exception {
    try {
        writeToFile(zipStream, uploadedFileLocation);
        FileUtils.forceDelete(new File(uploadedFileLocation));
        } catch (Exception e) {
             throw e;
        }
}


private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) {
    try {
        OutputStream out = new FileOutputStream(new File(uploadedFileLocation));
        int read = 0;
        byte[] bytes = new byte[1024];

        out = new FileOutputStream(new File(uploadedFileLocation));
        while ((read = uploadedInputStream.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        out.flush();
        out.close();
        uploadedInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

ユーザーがzipファイルをアップロードできるサーバーを作成しようとしています。次に、サーバーは zip ファイルをディスクに書き込み、解凍し、解凍された部分をサーバーに保持したまま zip を削除します。ただし、zip ファイルをサーバーに送信すると、削除できません。を使用FileUtils.forceDelete()すると、ファイルを削除できないと表示されます。zip は、解凍後に削除するのが理想的です。

編集:返品後にのみファイルを削除できpost(InputStream zip)ます。メソッド内から delete を呼び出しpostても、post が返されていないため、削除されません。これを回避する方法はありますか?

4

4 に答える 4

1

うーん。ディレクトリを削除しようとしているように見えますか?

FileUtils.forceDelete(new File(uploadedFileLocation));

しかし、あなたの方法uploadedFileLocationからの "C:\temp"です。postこれが問題の原因なのか、それとも意図した動作なのかはわかりませんが、そのコードは zip ファイルを削除せず、実際の C:\temp ディレクトリを削除しようとしています。

また、注目に値する可能性があります。writeToFileメソッドでは、OutputStream out2回初期化しています。post私はこれについて 100% ではありませんが、オブジェクト全体がスタックから削除されるまで (つまり、戻るとき)、最初の初期化でファイル ポインターを開いたままにしておくことができます。2 番目の初期化を取り出して、変更が発生するかどうかを確認しますか?

于 2013-08-01T14:41:42.377 に答える
0

あなたの問題は、「C:/temp/fileName」の代わりに「C:/temp」を使用していることが原因であると思われるため、権限のないフォルダーを削除しようとしてしまいます。

于 2013-08-01T14:39:26.967 に答える
0

ディレクトリを削除しようとしていることが問題でない場合は、削除しようとしているファイルがまだ開いている可能性があります。Windows では、これはファイルの削除を停止することを意味します。

一見すると、このwriteToFileメソッドはファイルを 2 回開きますが、ファイルを閉じるのは 1 回だけです。これは、ファイル記述子がリークし、OS がアプリケーションがまだファイルを使用していると見なすことを意味すると思われます。


file.delete(); を呼び出す必要があったことが判明しました。FileUtils を使用する代わりに。

私はそうは思わない。確かに、ファイルが削除されていないために例外が発生することはありません。しかし、代わりFile.delete()に戻りfalse、アプリケーションはファイル システムにファイルを残します。長期的には、孤立したファイルを一掃するために何か他のものを用意していない限り、それはさらに悪化する可能性があります.

于 2013-08-01T14:48:44.513 に答える