たとえば、ローカルにマップされたネットワークディレクトリにファイルをコピーするように指示されたWindows上のTomcat 7.0.42でこのWebアプリケーションを使用しましたN:\some\directory\file.txt
が、そうすることができません。
出力ファイルを定義するために、URI 構文を使用していますfile:///n:/some/directory/file.txt
が、あまり役に立たないエラー メッセージFiles.copy
をFileUtils.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");