我在文档目录中有一个需要压缩的文件夹。我能够压缩常规文件,但无法压缩文件夹。
我参考了以下链接 如何在 iPhone SDK 中压缩文件夹? 但是这里文件夹中的文件是单独压缩的。我想压缩整个文件夹,而不必处理目录中的内容(文件/文件夹)并一个一个压缩。
是否可以使用 ZipArchive 库来做到这一点。如果有人可以通过发布必要的代码来解释吗?
谢谢你。
我在文档目录中有一个需要压缩的文件夹。我能够压缩常规文件,但无法压缩文件夹。
我参考了以下链接 如何在 iPhone SDK 中压缩文件夹? 但是这里文件夹中的文件是单独压缩的。我想压缩整个文件夹,而不必处理目录中的内容(文件/文件夹)并一个一个压缩。
是否可以使用 ZipArchive 库来做到这一点。如果有人可以通过发布必要的代码来解释吗?
谢谢你。
你不能用 ZipArchive 做到这一点,但看看SSZipArchive它有一个+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath;
你可以使用的方法。
// Path to store Zip
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* dPath = [paths objectAtIndex:0];
NSString* zipfile = [dPath stringByAppendingPathComponent:@"test.zip"] ;
// File Tobe Added in Zip
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GetAllCardList" ofType:@"xml"];
NSString *fileName = @"MyFile"; // Your New ZipFile Name
ZipArchive* zip = [[ZipArchive alloc] init];
if([zip CreateZipFile2:zipfile])
{
NSLog(@"Zip File Created");
if([zip addFileToZip:filePath newname:[NSString stringWithFormat:@"%@.%@",fileName,[[filePath lastPathComponent] pathExtension]]])
{
NSLog(@"File Added to zip");
}
}
尝试 SSZipArchive
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirector;
我用了
let success = SSZipArchive.createZipFileAtPath(zipFullFilename, withContentsOfDirectory:dataDir, keepParentDirectory:true)
创建 zip 文件夹。它是有效的。
您只需要在将所有文件添加到 zip 之前获取 dir 的内容,如示例中所示。在代码中一一添加它们是相同的,因此只需获取一个列表然后遍历该列表。
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil];
如果您正在查找特定文件,您还可以使用谓词来过滤结果
NSPredicate *filter = [NSPredicate predicateWithFormat:@"self ENDSWITH '.png'"];
NSArray *pngs = [dirContents filteredArrayUsingPredicate:filter];
@implementation ZipArchive(Util)
+ (BOOL)makeZipFile:(NSString*)filepath withContentInDirectory:(NSString*)directory
{
ZipArchive* zip = [[ZipArchive alloc] initWithFileManager:[NSFileManager defaultManager]];
if ([zip CreateZipFile2:filepath]){
[self enumDirectory:directory zipFile:zip];
return [zip CloseZipFile2];
}
return NO;
}
+ (void)enumDirectory:(NSString*)directory zipFile:(ZipArchive*)zip
{
NSArray* resourceKeys = @[NSURLIsDirectoryKey];
NSDirectoryEnumerator<NSURL *> * enumerator = [[NSFileManager defaultManager] enumeratorAtURL:[NSURL fileURLWithPath:directory] includingPropertiesForKeys:resourceKeys options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:^BOOL(NSURL * _Nonnull url, NSError * _Nonnull error) {
return NO;
}];
for (NSURL* url in enumerator) {
NSDictionary<NSString *, id> *resourceValues = [url resourceValuesForKeys:resourceKeys error:nil];
BOOL isDirectory = [[resourceValues objectForKey:NSURLIsDirectoryKey] boolValue];
if (isDirectory) {
continue;
}
NSInteger len = [directory length];
NSString* subpath = [url.path substringFromIndex:len];
if ([subpath rangeOfString:@"/"].location == 0) {
subpath = [subpath substringFromIndex:1];
}
[zip addFileToZip:url.path newname:subpath];
}
}
@end