【问题标题】:How to compress/zip a folder in objective c without use of 3rd party libraries如何在不使用 3rd 方库的情况下压缩/压缩目标 c 中的文件夹
【发布时间】:2021-08-16 05:53:03
【问题描述】:

我想知道是否有一种方法可以在不使用第三方库且仅使用来自 .

的内容的情况下压缩文件

我正在尝试使用 NSData CompressDataUsingAlgorithm:NSDataCompressionAlgorithmZlib 压缩数据,然后使用 NSData writeToURL:@"Test.zip"。

此方法创建一个大小合适但无法被任何来源读取/存档的压缩文件。我知道这一点,因为我在 finder 中使用了存档功能并获得了一个可以存档的 zip 存档。

所以我觉得我这样做不正确,那么还有其他方法可以压缩文件夹吗?还是在写入我丢失的文件之前还有另一个步骤?

谢谢

编辑:添加我的代码

NSFileWrapper *dirWrapper = [[NSFileWrapper alloc] initWithURL:url options:0 error:&tep];
NSData *dirData = [dirWrapper serializedRepresentation];
NSData *gzData = [dirData compressedDataUsingAlgorithm:NSDataCompressionAlgorithmZlib error:&tep];
[gzData writeToURL:Url2 atomically:YES];

【问题讨论】:

  • 我不是在展示代码,我是在展示类函数名称。我不明白你为什么要回复这样的评论。如果在 sn-p 中编写我的所有代码将有助于回答它,我会很乐意这样做。但你不必对此无礼。
  • 不是真正的 cansyrup,我之前遇到过这个问题,并尝试了 libz 的实现,最终在存档中得到了一个包含数据本身的文件,而不是实际文件,因为我有那个文件包装器组件涉及。因为MacOS的finder里有压缩功能,所以一定有办法。
  • 这能回答你的问题吗? What does a zlib header look like?
  • 谢谢 Willeke,这可能会帮助我。

标签: objective-c macos


【解决方案1】:

对于需要归档包含文件的文件夹的问题,我找到了最佳解决方案:create zip archive using NSTask containing a first level folder with the files

像这样使用 usr/bin/ 中的 zip exec

NSURL *destURL = self.archiveDestURL;
NSTask *task = [[NSTask alloc] init];
[task setCurrentDirectoryPath:[srcURL path]]; 
[task setLaunchPath:@"/usr/bin/zip"];
NSArray *argsArray = [NSArray arrayWithObjects:@"-r", @"-q", [destURL path], @".", @"-i", @"*", nil];
[task setArguments:argsArray];
[task launch];
[task waitUntilExit];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多