0

たとえば、ローカルにマップされたネットワークディレクトリにファイルをコピーするように指示されたWindows上のTomcat 7.0.42でこのWebアプリケーションを使用しましたN:\some\directory\file.txtが、そうすることができません。

出力ファイルを定義するために、URI 構文を使用していますfile:///n:/some/directory/file.txtが、あまり役に立たないエラー メッセージFiles.copyFileUtils.copyFileスローします。IOException

URI desturi = new URI(srcpath);
File dest = new File(desturi);
Files.copy(source.toPath(), dest.toPath());
// error message: "c:\local\dir\file.txt -> n:\some\directory\file.txt"

FileUtils.copyFile(source, dest);
// error message: "Destination 'N:\some\directory' directory cannot be created"

いくつかの追加情報:

  • もちろん、そのディレクトリで読み書きできます
  • 実行可能な .jar は問題なくファイルをコピーできます
  • 宛先がローカル ドライブにある場合は、すべて問題ありません
  • セキュリティマネージャーが読み込まれていないと思いますが、どうすれば確認できますか?
  • Tomcat は、ログインに使用するのと同じユーザーで開始されます (たとえば、環境変数user.nameと同じです)USERNAME

私はアイデアがありません...

スタック トレースのスニペットを更新します。の場合Files.copy:

java.nio.file.NoSuchFileException: c:\local\dir\file.txt -> n:\some\directory\file.txt
    at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
    at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
    at sun.nio.fs.WindowsFileCopy.copy(Unknown Source)
    at sun.nio.fs.WindowsFileSystemProvider.copy(Unknown Source)
    at java.nio.file.Files.copy(Unknown Source)
    at it.augea.print.server.MyClass.copyFileToPath(MyClass.java:886)
    at it.augea.print.server.MyServlet.doPost(MyServlet.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

の場合FileUtils.copyFile:

java.io.IOException: Destination 'N:\some\directory' directory cannot be created
    at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1015)
    at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:968)
    at it.augea.print.server.MyClass.copyFileToPath(MyClass.java:886)
    at it.augea.print.server.MyServlet.doPost(MyServlet.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

ちなみに、Apache Commons.io は v2.2 です。ソース コードを見ると、関連する行は次のとおりです。

File parentFile = destFile.getParentFile();
if (parentFile != null)
    if (!parentFile.mkdirs() && !parentFile.isDirectory())
        throw new IOException("Destination '" + parentFile + "' directory cannot be created");
4

2 に答える 2

1

Tomcat (またはその他のプログラム) が Windows サービスとして実行される場合、サービス アカウントで実行され、それらのアカウントは (デフォルトでは) マップされたドライブにアクセスできません (または、メモリがネットワーク パスを正しく提供している場合)。Tomcat は N: ドライブを認識できないため、ドライブへの書き込みは失敗します。

考えられる解決策はいくつかあります。私の推奨事項は、Tomcat を実行するためのドメイン アカウントを作成することです。そのアカウントには、a) 実行中のマシンでサービスとして実行し、b) ネットワーク上の必要な場所に書き込みを行うために最低限必要なアクセス許可が付与されています。最後に、マップされたドライブではなく UNC パス //machinename/sharename/path/in/share を使用すれば、準備完了です。

于 2013-11-09T18:47:03.300 に答える
0

JVM は、コピーするファイルのフォルダーを作成できません。

JVMがそれにアクセスできるかどうかを確認してください。

于 2013-10-29T12:08:31.303 に答える