如何在truzip中获取文件大小

时间:2016-04-20 10:20:12

标签: java truezip

我正在使用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() 我不太明白它的作用

3 个答案:

答案 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?