我正在使用truezip版本(7.7.9)来更新存档文件。 我这样做的方式如下
File entry = new TFile(filepath);
writer = new TFileWriter(entry);
writer.append("MyString");
writer.flush();
long fileSize = entry.length(); // which always gives value as 0
出于某种目的,我需要确切的文件大小 但这总是给出0 有没有其他方法我可以得到它。
我阅读了TFile类的文档\ https://truezip.java.net/apidocs/de/schlichtherle/truezip/file/TFile.html#length() 我不太明白它的作用
答案 0 :(得分:1)
来自FAQ:
您可能偶尔会将存档文件视为一个 常规文件而不是虚拟目录。例如,在尝试时 以字节为单位获取存档文件的长度。你通常会 通过调用File.length()方法来完成此操作。 但是,如果是文件 object是TFile类的一个实例,路径一直是 检测到命名有效的存档文件,然后此方法将始终 返回零。这是因为您可能更改了存档文件 然后就不可能返回一个精确的结果直到 已将更改提交到目标存档文件。
似乎您可以在更改文件之前计算文件的大小,然后添加要附加的文件的大小,或者您需要编写文件然后调用File.length()
。您可以致电TVFS.unmount()或TVFS.unmount(TFile)
答案 1 :(得分:1)
在官方网页
上查看此文章The API should not detect an individual archive file as a virtual directory. How can I do this
看看这个
[...] 但是,如果 File 对象是 TFile 类的实例,并且已检测到路径以命名有效的存档文件,则此方法将始终返回零。这是因为您可能更改了存档文件,然后在将更改提交到目标存档文件之前无法返回精确的结果。
它也适用于 TPath
我想知道您是否可以使用 Files.size(路径)来获取所需内容(在TZip更改之前和之后)
希望它会有所帮助。
答案 2 :(得分:1)
如果存档文件有效,则返回0.如果出现任何问题,则会产生IOException。
如果您更改了任何内容,则需要调用方法TFile.umount()
来提交所有更改。
然后使用以下方法获取TFile,该TFile不检测存档文件并调用其length()
方法:
在TrueZIP 7.5
中,您只需拨打TFile.toNonArchiveFile()
// Note that the actual path may refer to anything, even a nested archive file.
TFile inner = new TFile("outer.zip/inner.zip");
TFile file = inner.toNonArchiveFile(); // convert - since TrueZIP 7.5
... // there may be some I/O here
TVFS.umount(inner); // unmount potential archive file
// Now you can safely do any I/O to $file.
long length = file.length();
您也可以通过其他方式实现:
private static TFile newNonArchiveFile(TFile file) {
return new TFile(file.getParentFile(), file.getName(), TArchiveDetector.NULL);
}
资源链接: How can you get the size of a file in an archive using TrueZip?