

Xcode7.0+Swift2でファイル圧縮用のOS X(Cocoa)アプリケーションをつくろうとしています。  
圧縮に用いているライブラリは[ZipArchive](https://github.com/ZipArchive/ZipArchive)(旧SSZipArchive)というもので、次の2つの関数を備えています。

・複数のファイルから圧縮ファイルを作る  
createZipFileAtPath(保存先, withFilesAtPaths: ファイルパスの配列)

・単一のフォルダとその内容から圧縮ファイルを作る  
createZipFileAtPath(保存先, withContentsOfDirectory: フォルダパス)

ファイルのみ、フォルダ一つならこれらの関数で圧縮ファイルを作ることができますが、複数のファイルと複数のフォルダを元に圧縮ファイルを作りたい場合、withFilesAtPathsにフォルダパスを混ぜることはできないようです。

その場合一時的にフォルダを１つ作り、その中に圧縮する内容をすべてコピーしておき、withContentsOfDirectoryのほうで圧縮すれば良さそうなのですが、小さなファイルなら一瞬でも、大きなファイルを圧縮する際は一時フォルダへのコピーに時間がかかります。

可能なら直接的にフォルダ、ファイルの混在する圧縮ファイルを作りたいのですがそういう方法はあるのでしょうか？  
別のライブラリでも構いません。

* * *

【追記】  
質問から日にちが経ったため開発環境が Swift 1.x→2.xに変わりました。


CC BY-SA 3.0
2015-07-25T02:59:18.260
12675
2015-09-25T03:28:02.427
2015-09-25T03:28:02.427
10083
10083
question
swift xcode macos
OS X用プログラムでファイルとフォルダを圧縮したい


こんにちは。そのライブラリは使ったことはないので良い回答はできないのですが。

そういう目的であれば、そのライブラリを使わずに標準の libz.dylib
ライブラリを使ってご自身のプログラム中で目的の複数ファイルと複数フォルダを回してひとつづつ ZIP していけばいいのではないでしょうか。

一部だけですが

[code]

    - (NSData *)zlibInflate
    {
        if ( [self length] == 0 )
        {
            return self;
        }
    
        NSUInteger full_length = [self length];
        NSUInteger half_length = full_length / 2;
        NSMutableData *decompressed = [NSMutableData dataWithLength:(full_length + half_length)];
        int status;
        z_stream strm;
    
        strm.next_in = (Bytef *)[self bytes];
        strm.avail_in = (NMUInt)full_length;
        strm.total_out = 0;
        strm.zalloc = Z_NULL;
        strm.zfree = Z_NULL;
    
        if ( inflateInit (&strm) == Z_OK )
        {
            BOOL done = FALSE;
    
            while ( ! done )
            {
                if ( strm.total_out >= [decompressed length] )
                {
                    [decompressed increaseLengthBy:half_length];
                }
    
                strm.next_out = [decompressed mutableBytes] + strm.total_out;
                strm.avail_out = ( [decompressed length] - strm.total_out );
    
                status = inflate (&strm, Z_SYNC_FLUSH);
    
                if ( status == Z_STREAM_END )
                {
                    done = TRUE;
                }
                else if ( status != Z_OK )
                {
                    break;
                }
            }
    
            if ( inflateEnd (&strm) == Z_OK )
            {
                if ( done )
                {
                    [decompressed setLength:strm.total_out];
    
                    return [NSData dataWithData:decompressed];
                }
            }
        }
    
        return self;
    }
    
[/code]

ご参考になれば。


CC BY-SA 3.0
2015-09-18T14:24:01.303
16755
2015-09-18T14:24:01.303
12675
answer


コピーが時間かかるなら、代わりに symbolic link でいかがでしょうか。


CC BY-SA 3.0
2015-09-19T00:46:16.520
16765
2015-09-19T00:46:16.520
5288
12675
answer