سؤال

وتمسك حقا على محاولة كتابة التعليمات البرمجية لبفك ملف أو دليل على اي فون.

وفيما يلي بعض نموذج التعليمات البرمجية التي أنا باستخدام لمحاولة بفك ملف نصي.

ووunzips الملف ولكن من الفاسدين.

(void)loadView {

    NSString *DOCUMENTS_FOLDER = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *path = [DOCUMENTS_FOLDER stringByAppendingPathComponent:@"sample.zip"];

    NSString *unzipeddest = [DOCUMENTS_FOLDER stringByAppendingPathComponent:@"test.txt"];  

    gzFile file = gzopen([path UTF8String], "rb");

    FILE *dest = fopen([unzipeddest UTF8String], "w");

    unsigned char buffer[CHUNK];

    int uncompressedLength = gzread(file, buffer, CHUNK);

    if(fwrite(buffer, 1, uncompressedLength, dest) != uncompressedLength ||     ferror(dest)) {
        NSLog(@"error writing data");
    }
    else{

    }

    fclose(dest);
    gzclose(file);  
}
هل كانت مفيدة؟

المحلول

لقد "sample.zip" حقا تم إنشاؤها باستخدام GZIP؟ في الملحق .zip عادة ما يستخدم لالمحفوظات التي تم إنشاؤها بواسطة برنامج لضغط الملفات. هذه يمكن أيضا ضغط باستخدام ZLIB، ولكن عليك أن تحليل رأس واستخدام إجراءات أخرى.

لتحقق، إلقاء نظرة على وحدتي بايت الأولى من الملف. إذا كان "PK"، فإنه من برنامج لضغط الملفات، لو كان 0x1F8B، انها GZIP.

ولأن هذا هو فون محددة، وإلقاء نظرة على هذا <وأ href = "http://www.iphonedevsdk.com/forum/iphone-sdk-development/4492-using-zlib-unzip-archives.html" يختلط = "نوفولو noreferrer"> آي فون SDK منتدى للنقاش حيث ذكر miniZip . يبدو أن هذا يمكن التعامل مع ملفات برنامج لضغط الملفات.

ولكن اذا كان حقا ملف برنامج لضغط الملفات، يجب أن يكون لديك نظرة على مواصفات برنامج لضغط الملفات و محاولة تحليل الملف بنفسك. انها اساسا يجب تحليل بعض القيم الرأس، والسعي الى موقف تيار مضغوط وباستخدام إجراءات ZLIB لضغط عليه.

نصائح أخرى

وكنت أريد حلا سهلا، ولم تجد واحدة أحببت هنا، ولذا فإنني تعديل مكتبة لتفعل ما أردت. قد تجد SSZipArchive مفيدة. (ويمكن أيضا إنشاء ملفات مضغوطة من جانب الطريق.)

والاستعمال:

NSString *path = @"path_to_your_zip_file";
NSString *destination = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:path toDestination:destination];

وهذا الرمز يعمل بشكل جيد بالنسبة لي لGZIP:

تم إعداد قاعدة بيانات من هذا القبيل:     غزيب foo.db

ومفتاح وحلقات خلال gzread (). في المثال أعلاه فقط يقرأ بايت أول قطعة.

#import <zlib.h>
#define CHUNK 16384


  NSLog(@"testing unzip of database");
  start = [NSDate date];
  NSString *zippedDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"foo.db.gz"];
  NSString *unzippedDBPath = [documentsDirectory stringByAppendingPathComponent:@"foo2.db"];
  gzFile file = gzopen([zippedDBPath UTF8String], "rb");
  FILE *dest = fopen([unzippedDBPath UTF8String], "w");
  unsigned char buffer[CHUNK];
  int uncompressedLength;
  while (uncompressedLength = gzread(file, buffer, CHUNK) ) {
    // got data out of our file
    if(fwrite(buffer, 1, uncompressedLength, dest) != uncompressedLength || ferror(dest)) {
      NSLog(@"error writing data");
    }
  }
  fclose(dest);
  gzclose(file);
  NSLog(@"Finished unzipping database");

وبالمناسبة، لا أستطيع بفك 33MB إلى 130MB في 77 ثانية أو نحو 1.7 MB غير مضغوط / ثانية.

وهذا الرمز سوف بفك أي ملف .zip إلى دليل ثيقة التطبيق الخاص بك، والحصول على الملف من موارد التطبيق.

self.fileManager = [NSFileManager defaultManager];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSLog(@"document directory path:%@",paths);

self.documentDirectory = [paths objectAtIndex:0];

NSString *filePath = [NSString stringWithFormat:@"%@/abc", self.documentDirectory];

NSLog(@"file path is:%@",filePath);

NSString *fileContent = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"data.zip"];


NSData *unzipData = [NSData dataWithContentsOfFile:fileContent];

[self.fileManager createFileAtPath:filePath contents:unzipData attributes:nil];

// here we go, unzipping code

ZipArchive *zipArchive = [[ZipArchive alloc] init];

if ([zipArchive UnzipOpenFile:filePath])
{
    if ([zipArchive UnzipFileTo:self.documentDirectory overWrite:NO])
    {
        NSLog(@"Archive unzip success");
        [self.fileManager removeItemAtPath:filePath error:NULL];
    }
    else
    {
        NSLog(@"Failure to unzip archive");
    }
}
else
{
    NSLog(@"Failure to open archive");
}
[zipArchive release];

وانه من الصعب حقا أن بفك أي ملف مضغوط التعسفي. انها شكل ملف معقد، وهناك العديد من المحتمل الروتينية ضغط المختلفة التي يمكن أن تستخدم داخليا إلى الملف. معلومات-ZIP ديه بعض رمز licencable بحرية للقيام بذلك ( HTTP: // شبكة الاتصالات العالمية INFO.، zip.org / UnZip.html ) التي يمكن تقديمها للعمل على اي فون مع بعض القرصنة، ولكن API أمر فظيع بصراحة - أنه ينطوي على تمرير الوسائط سطر الأوامر لوهمية "الرئيسي" الذي يحاكي تسيير بفك (لكي نكون منصفين ذلك لأن مدوناتها لم يكن تصميمها ليتم استخدامها مثل هذا في المقام الأول، وقد انسحب وظائف مكتبة في ما بعد).

إذا كان لديك أي سيطرة من حيث الملفات التي تحاول بفك قادمون من، I للغاية نوصي باستخدام نظام ضغط آخر بدلا من ZIP. انها المرونة وانتشار جعلها كبيرة لتمرير محفوظات الملفات في جميع انحاء من شخص إلى شخص، لكنه صعب جدا لأتمتة.

وليس المقصود

وزليب لفتح ملفات الرمز البريدي، ولكن كنت في الحظ: دليل contrib زليب ليشمل minizip، التي هي قادرة على استخدام زليب لفتح ملفات الرمز البريدي

قد لا تكون واحدة وفي SDK، ولكن ربما يمكنك استخدام النسخة واحدة من زليب استخدامها. الاستيلاء على نسخة من المصدر زليب والبحث في contrib / minizip.

وأنا لم تستخدم اي فون، ولكن قد ترغب في النظر في GZIP ، وهو محمولة جدا مفتوحة المصدر مكتبة البريدي المتاحة للعديد من المنصات.

وكان لي بعض الحظ هذا الاختبار على جهاز محاكاة اي فون:

NSArray *paths = 
   NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *saveLocation = 
   [documentsDirectory stringByAppendingString:@"myfile.zip"];

NSFileManager* fileManager = [NSFileManager defaultManager];

if ([fileManager fileExistsAtPath:saveLocation]) {
    [fileManager removeItemAtPath:saveLocation error:nil];

}

NSURLRequest *theRequest = 
             [NSURLRequest requestWithURL:
                [NSURL URLWithString:@"http://example.com/myfile.zip"]
             cachePolicy:NSURLRequestUseProtocolCachePolicy
             timeoutInterval:60.0];    

NSData *received = 
             [NSURLConnection sendSynchronousRequest:theRequest 
                              returningResponse:nil error:nil];    

if ([received writeToFile:saveLocation atomically:TRUE]) {      
    NSString *cmd = 
       [NSString stringWithFormat:@"unzip \"%@\" -d\"%@\"", 
       saveLocation, documentsDirectory];       

    // Here comes the magic...
    system([cmd UTF8String]);       
}

ويبدو أسهل من تافه حول مع زليب ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top