无法访问Java创建的文件--有时
在Java中,我使用在WinXP下运行的代码创建如下文件:无法访问Java创建的文件--有时,java,file-io,windows-xp,Java,File Io,Windows Xp,在Java中,我使用在WinXP下运行的代码创建如下文件: public synchronized void store(Properties props, byte[] data) { try { File file = filenameBasedOnProperties(props); if ( file.exists() ) { return; } File
public synchronized void store(Properties props, byte[] data) {
try {
File file = filenameBasedOnProperties(props);
if ( file.exists() ) {
return;
}
File temp = File.createTempFile("tempfile", null);
FileOutputStream out = new FileOutputStream(temp);
out.write(data);
out.flush();
out.close();
file.getParentFile().mkdirs();
temp.renameTo(file);
}
catch (IOException ex) {
// Complain and whine and stuff
}
}
有时,以这种方式创建文件时,即使应用程序未运行,也几乎无法从代码外部访问文件(尽管负责打开和读取文件的代码没有问题)。通过Windows资源管理器访问时,我无法移动、重命名、删除甚至打开该文件。在Cygwin下,当我ls-l
ls:无法访问[大honkin文件名]
总数0
?????????? ? ? ? ? ? [big honkin文件名]
正如所暗示的那样,文件名很大,但XP的最大文件名不超过260个字符(尽管它们略多于200个字符)
为了进一步增加我的计算机只是想让我觉得自己很愚蠢的感觉,有时由这段代码创建的文件是完全正常的。我发现的唯一模式是,一旦目录中的一个文件“锁定”,其余的文件就被破坏了
以前有没有人遇到过类似的情况,或者对这里发生的事情有什么见解?请确保始终在
finally
块中关闭流。在您的情况下,如果抛出异常,流可能无法关闭,并将泄漏文件句柄。您可以使用from SysInternals查看哪个进程持有文件的句柄。确保始终在finally
块中关闭流。在您的情况下,如果抛出异常,流可能无法关闭,并将泄漏文件句柄。您可以使用from SysInternals查看哪个进程持有文件的句柄。尽管根据定义,NTFS应该处理最多2^15-1的路径长度,但实际上路径长度限制为255
您可以创建路径名较长的文件(文件名包括父文件夹名),但以后无法访问这些文件。在这些情况下,我得到的错误是找不到文件。要删除这些文件,我必须缩短父文件夹的名称,直到路径长度足够短。尽管根据定义,NTFS应处理最多2^15-1的路径长度,但实际上路径长度限制为255
您可以创建路径名较长的文件(文件名包括父文件夹名),但以后无法访问这些文件。在这些情况下,我得到的错误是找不到文件。要删除这些文件,我必须缩短父文件夹的名称,直到路径长度足够短。这是一个合理的建议和值得的调整,但它不会引发异常,因此这似乎不太可能是我的根本原因。Process Explorer没有显示任何人拥有该文件的句柄;我在查找->查找句柄或DLL中输入文件名。。。并在搜索中获得0个匹配项。合理的建议和值得的调整,但不会引发异常,因此这似乎不太可能是我的根本原因。Process Explorer没有显示任何人拥有该文件的句柄;我在查找->查找句柄或DLL中输入文件名。。。并在搜索中获取0个匹配项。(OT)您不需要在即将关闭文件时刷新-close()完成所有需要的刷新。您应该检查mkdirs和renameTo(OT)的返回值。您不需要在即将关闭文件时刷新-close()你应该检查mkdirs和rename的返回值,这正是它的本质。谢谢天哪,这就是事实。谢谢 ls: cannot access [big-honkin-filename] total 0 ?????????? ? ? ? ? ? [big-honkin-filename]