1

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

4

3 回答 3

1

如果归档文件有效,则返回 0。如果出现任何问题,则会给出 IOException。

如果您更改任何内容,则需要调用该方法TFile.umount()来提交所有更改。

然后使用下面的方法获取一个没有检测到归档文件的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);
}

资源链接: 如何使用 TrueZip 获取存档中文件的大小?

于 2016-04-26T12:37:00.910 回答
1

常见问题解答

有时您可能希望将存档文件视为常规文件而不是虚拟目录。例如,当试图获取存档文件的字节长度时。您通常会通过调用方法 File.length() 来执行此操作。但是,如果 File 对象是 TFile 类的一个实例,并且已检测到路径以命名一个有效的存档文件,则此方法将始终返回零。这是因为您可能已经更改了存档文件,然后在将更改提交到目标存档文件之前不可能返回精确的结果。

似乎您可以在更改文件之前计算文件的大小,然后添加要附加的文件的大小,或者您需要编写文件然后调用File.length(). 您可以通过调用TVFS.unmount()TVFS.unmount(TFile)来执行此操作

于 2016-04-26T11:40:21.190 回答
1

在官方页面看到这篇文章

API 不应将单个存档文件检测为虚拟目录。我怎样才能做到这一点

看这个

[...] 但是,如果File对象是TFile类的实例,并且检测到路径以命名有效的存档文件,则此方法将始终返回零。这是因为您可能已经更改了存档文件,然后在将更改提交到目标存档文件之前不可能返回精确的结果。

它也适用于TPath

我想知道您是否可以使用Files.size(path)来获得所需的内容(在更改 TZip 之后和之前)

希望它会有所帮助。

于 2016-04-26T11:42:31.770 回答