2

我在文档目录中有一个需要压缩的文件夹。我能够压缩常规文件,但无法压缩文件夹。

我参考了以下链接 如何在 iPhone SDK 中压缩文件夹? 但是这里文件夹中的文件是单独压缩的。我想压缩整个文件夹,而不必处理目录中的内容(文件/文件夹)并一个一个压缩。

是否可以使用 ZipArchive 库来做到这一点。如果有人可以通过发布必要的代码来解释吗?

谢谢你。

4

5 回答 5

4

你不能用 ZipArchive 做到这一点,但看看SSZipArchive它有一个+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath; 你可以使用的方法。

于 2013-05-07T20:26:25.870 回答
2
// 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");
    }
}
于 2013-05-08T04:34:30.297 回答
2

尝试 SSZipArchive

+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirector;

我用了

let success = SSZipArchive.createZipFileAtPath(zipFullFilename, withContentsOfDirectory:dataDir, keepParentDirectory:true)

创建 zip 文件夹。它是有效的。

于 2016-03-18T10:43:46.400 回答
0

您只需要在将所有文件添加到 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];
于 2013-05-07T18:50:57.100 回答
0
@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
于 2021-09-14T09:12:48.907 回答