在Java中,我正在使用在WinXP下运行的代码来创建这样的文件:
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: cannot access [big-honkin-filename]
total 0
?????????? ? ? ? ? ? [big-honkin-filename]
正如所暗示的那样,文件名很大,但XP最大为260个字符(尽管它们略超过200个字符)。
为了进一步增加我的计算机只是让我感到愚蠢的感觉,有时这段代码创建的文件是完全正常的。我发现的唯一模式是,一旦目录中的一个文件“锁定”,其余文件就会被搞砸。
之前有人遇到类似这样的事情,或者对这里发生的事情有任何见解?
答案 0 :(得分:3)
确保始终在finally
块中关闭流。在您的情况下,如果抛出异常,流可能不会被关闭并且将泄漏文件句柄。您可以使用SysInternals中的procexp来查看哪个进程拥有该文件的句柄。
答案 1 :(得分:1)
虽然根据定义,NTFS应该处理最多2 ^ 15-1的路径长度,但实际上路径的长度限制为255.
您可以创建具有较长路径名的文件(包含父文件夹名称的文件名),但之后您无法访问它们。我在这些情况下得到的错误是无法找到该文件。为了摆脱这些文件,我必须缩短父文件夹的名称,直到路径长度足够短。