我在 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");