java.io.IOException的可能原因是什么:“文件名,目录名或卷标语法不正确”
题
我正在尝试使用以下代码复制文件:
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
的写入权限,并且可以使用操作系统轻松复制文件。
由于我无法访问某台计算机,但是我无法在自己的计算机上重现该问题,因此我向您寻求有关此异常原因的提示。
解决方案
试试这个,因为它需要更多地调整targetPath和filename之间路径中的目录分隔符:
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:\"在确定您具有该目录的写入权限之后。如果可行,则该文件的路径名是错误的。
查看Exception中的注释,并尝试更改文件路径名中的所有元素。实验。得出结论。
您是否检查了targetPath是一个目录,还是仅存在具有该名称的内容? (我知道你说用户可以从操作系统中复制它,但也许他们正在输入别的东西)。
targetPath是否已以File.separator结尾?
(如果你能记录并告诉我们在失败的情况下targetPath和filename的值是多少会有帮助的)
也许问题是它是通过网络将文件复制到共享驱动器?我认为当路径类似于\ mypc \ myshared文件夹时,使用NFS编写文件时java会出现问题。
发生此问题的路径是什么?
尝试添加一些日志记录,以确切了解文件尝试创建的名称和路径,以确保父目录是一个目录。
此外,您还可以查看频道而不是使用循环。 ; - )
你说“对某些用户” - 所以它适用于其他人?这里的区别是,用户在不同的机器上运行不同的实例,还是为并发用户提供服务的服务器?
如果是后者,我会说这是一个并发错误 - 两个线程检查尝试同时使用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);
}
之后,它可以为报告问题的用户提供帮助。
所以Alexanders似乎回答了这个伎俩 - 虽然我实际上使用的构造函数与他给出的略有不同,但是沿着相同的路线。
我还不得不通过再次运行旧版本并检查它是否仍然失败来帮助我验证代码更改是否修复了错误(而不是他做了不同的事情)。
顺便说一句。记录已经到位,记录的路径似乎没问题 - 抱歉没有提到。我认为这是理所当然的,并发现问题中的代码不必要地复杂化。
感谢您提供有用的答案。
一个非常类似的错误: - " ... java.io.IOException:文件名,目录名或卷标语法不正确“ 当TOMCAT主页设置有训练反斜杠时,我在Eclipse中为我生成了。
小编辑建议: - http://www.coderanch.com/t/556633 / Tomcat的/ JAVA-IO-IOException异常文件名,目录 为我修好了。
删除完整路径中文件/文件夹名称中的所有特殊字符。