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导致此exception:

 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写入权限,并且可以使用操作系统轻松复制文件。

由于我无法访问机器,但这种情况还没有,并且无法在我自己的机器上重现问题,我转向您提供有关此exception原因的提示。

试试这个,因为更需要调整targetPath和filename之间路径中的目录分隔符:

 File targetFile = new File(targetPath, filename); 

我刚遇到同样的问题。 我认为这与写访问权限有关。 我在尝试写入c:\时遇到错误,但在更改为D:\时一切正常。 显然Java没有权限写入我的系统驱动器(运行安装在C上的Windows 7 🙂

这是我使用的测试程序

 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中的注释,并尝试更改文件路径名中的所有元素。 实验。 得出结论。

仅供参考,当我的文件名有冒号时间戳时,我得到了,即myfile_HH:mm:ss.csv删除冒号修复了问题。

您是否检查了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的答案就是这个伎俩 – 虽然我实际上使用的构造函数与他给出的略有不同,但是沿着相同的路线。

我还要告诉那个用户帮助我validation代码更改通过再次运行旧版本并检查它是否仍然失败来修复错误(而不是他做了不同的事情)。

顺便说一句。 记录已经到位,记录的路径似乎没问题 – 抱歉没有提到。 我认为这是理所当然的,并发现问题中的代码不必要地复杂化。

谢谢你的帮助。

一个非常类似的错误: – “… java.io.IOException:文件名,目录名称或卷标语法不正确”是在Eclipse中为我生成的,当TOMCAT主页设置有训练反斜杠时。

小编辑建议: – http://www.coderanch.com/t/556633/Tomcat/java-io-IOException-filename-directory为我修复了它。