愚头的博客

一位图形学爱好者的唠叨

UE4新插件 - ZipPlatformFile

介绍

此插件的目的是为了更好地读取.zip压缩文件,功能参考PakPlatformFile。 如果你了解UE4pak的话,可以发现pakzip文件有很多相似的地方。 同样可以通过.zip文件来打包UE4的资源(.uasset.umap等),并用于加载😄。

特性

  • 内存中解压,不占用磁盘空间
  • 仅支持读取
  • 使用UE4自带的zlib进行解压
  • 挂载和卸载
  • 挂载点
  • 解压密码
  • 蓝图方法

使用方法

可以从https://github.com/jixingcn/ZipPlatformFile下载源码,并解压到您的UE4项目Plugins目录中,或者以子模块形式加入到UE4git项目中。

zipplatformfile_dir

示例

假设一个D:\test.zip文件,其密码为password,并且有如下目录结构:

  • scheme.json
  • companies/
    • companyA/
      • users/
        • john.json
        • john.xlsx
    • companyB/
      • users/
        • lily.json
        • lili.docx
        • lily.xlsx

挂载.zip文件

通过UZipPlatformFileBlueprintFunctionLibrary::Mount挂载该文件,将其挂载点设置为/Game/test_zip

蓝图:

代码:

UZipPlatformFileBlueprintFunctionLibrary::Mount(this, TEXT("/Game/test_zip"), TEXT("D:\\test.zip"), TEXT("password"));

这个挂载点可以由你自己来决定,不过根目录需要按照UE4官方的目录映射关系来。如:

  • /Engine:对应项目的引擎的Content目录
  • /Game:对应项目的Content目录
  • /ZipPlatformFile:对应项目的Plugins/ZipPlatformFile/Content目录

文件无密码,则密码处为空。

读取.zip中的文件

加载该文件companies/companyB/users/lily.json的内容:

蓝图:

代码:

FString LilyJsonContext;
FFileHelp::LoadToString(TEXT("/Game/test_zip/companies/companyB/users/lily.json"), LilyJsonContext);
/// 或者
UZipPlatformFileBlueprintFunctionLibrary::LoadFileToString(this, TEXT("/Game/test_zip/companies/companyB/users/lily.json"), LilyJsonContext);

加载该文件companies/companyB/users/lily.xlsx的内容:

TArray<uint8> LilyXlsxContext;
FFileHelp::LoadFileToArray(TEXT("/Game/test_zip/companies/companyB/users/lily.xlsx"), LilyXlsxContext);
/// 或者
UZipPlatformFileBlueprintFunctionLibrary::LoadFileToArray(this, TEXT("/Game/test_zip/companies/companyB/users/lily.json"), LilyXlsxContext);

判断是否存在文件或目录

蓝图:

代码:

FPaths::FileExists(TEXT("/Game/test_zip/scheme.json"));
/// 或者
UZipPlatformFileBlueprintFunctionLibrary::FileExists(this, TEXT("/Game/test_zip/scheme.json"));
FPaths::DirectoryExists(TEXT("/Game/test_zip/companies/companyA"));
/// 或者
UZipPlatformFileBlueprintFunctionLibrary::DirectoryExists(this, TEXT("/Game/test_zip/companies/companyA"));

获取文件或目录的创建时间和访问时间

蓝图:

代码:

FDateTime CreationTime, AccessTimeStamp;
UZipPlatformFileBlueprintFunctionLibrary::GetTimeStamp(this, TEXT("/Game/test_zip/companies/companyA/users/john.xlsx"), CreationTime, AccessTimeStamp);

获取文件或目录的状态

FFileStatData FileStatData;
UZipPlatformFileBlueprintFunctionLibrary::GetFileStatData(this, TEXT("/Game/test_zip/scheme.json"), FileStatData);

卸载.zip文件

蓝图:

代码:

UZipPlatformFileBlueprintFunctionLibrary::Unmount(this, TEXT("D:\\test.zip"));

注意

此插件是对IPlatformFile模块的扩展,所以在读取文件时要通过IPlatformFileFFileHelperFPathsUZipPlatformFileBlueprintFunctionLibrary的接口来加载。

如果你要使用.zip来打包和加载UE4资源,和pak一样要注意挂载点的路径。

后续更新

新接口 - ZipPlatformFile

感谢

https://blueprintue.com/ 是一个非常棒👍的网站,它能够很容易地在网页上展示蓝图。