UE4生成zip压缩文件 | Blurred code

UE4生成zip压缩文件

2022/11/20

LastMod:2024/07/06

Categories: UE

Engine Version: 4.26.2

最近有用UE生成zip文件的需求。

FZipArchiveWriter

UE提供一个非常简单的RAII风格的ZIP类FZipArchiveWriter,只有三个API(Engine/Source/Developer/FileUtilities/Public/FileUtilities/ZipArchiveWriter.h)

	FZipArchiveWriter(IFileHandle* InFile);
	~FZipArchiveWriter();
	void AddFile(const FString& Filename, const TArray<uint8>& Data, const FDateTime& Timestamp);

该类使用起来非常简单,但是其具有几个问题。

通过第三方库压缩

可以通过kuba--/zip: A portable, simple zip library written in C 进行压缩,使用方法见ReadMe。 三个文件可以直接集成进UE,并且是Public License,无协议污染风险。

唯一需要注意的是最好保存UTF-8,所以需要从FString转到UTF8做处理。 如果想要保存UTF-16字符串可能需要手动加UTF16-BOM。 大端序是0xFE 0xFF,小端序是0xFF 0xFE

似乎对UTF-8的Entry Name支持有点问题,但是本身zip对这个支持就不好,最好不要用中文当文件名。 https://github.com/kuba--/zip/issues/265

FString VeryLongText = "....";
FTCHARToUTF8 VeryLongText_UTF8(*VeryLongText);
zip_t* zip = zip_open(ZipPath_UTF8.Get(), ZIP_DEFAULT_COMPRESSION_LEVEL, 'w');
{
	zip_entry_open(zip, TCHAR_TO_UTF8(TEXT("VeryLongText.txt")));
	{
		zip_entry_write(zip, VeryLongText_UTF8.Get(), VeryLongText_UTF8.Length());
	}
	zip_entry_close(zip);
}
zip_close(zip);