zip files

  • zlib ist Dein Freund.
    Gibt es irgendwo auf der Darwin Apple Opensource Seite.

    Bisher habe ich nur die Logik zum packen integriert.
    Falls den Code und die Dateien habe willst ( oder wer anders), einfach per Mail bei mir melden.
    Das entpacken wollte ich auch noch schreiben. War bisher zu faul, dafür habe ich ein Shell Script + unzip im bundle und rufe dieses über NSTask auf. Sollte aber auch nicht so schwer zu schreiben sein.

    Hoffe aber bald das Apple (10.4.) das ins NSWorkspace aufnimmt (Methoden deklariert aber unnutzbar).

    Sven
    :wq! /dev/null
  • Original von Michael
    Original von Stalkingwolf
    Gibt es irgendwo auf der Darwin Apple Opensource Seite.

    Das gibt es sogar direkt im System. D.h. man muss sich die zlib nicht erst irgendwo besorgen. Sie ist schon da.

    Michael

    ja nun unter 10.3.
    Glaub unter 10.2 war die noch nicht da und da hab ich es selber integeriert.
    kompletten Quellcode mit Library.

    wenn die nun da ist, lib + header file einbinden und dann:

    Quellcode

    1. #define WRITEBUFFERSIZE (16384)
    2. uLong filetime(f, tmzip, dt)
    3. char *f; /* name of file to get info on */
    4. tm_zip *tmzip; /* return value: access, modific. and creation times */
    5. uLong *dt; /* dostime */
    6. {
    7. int ret=0;
    8. struct stat s; /* results of stat() */
    9. struct tm* filedate;
    10. time_t tm_t=0;
    11. if (strcmp(f,"-")!=0)
    12. {
    13. char name[255];
    14. int len = strlen(f);
    15. strcpy(name, f);
    16. if (name[len - 1] == '/')
    17. name[len - 1] = '\0';
    18. /* not all systems allow stat'ing a file with / appended */
    19. if (stat(name,&s)==0)
    20. {
    21. tm_t = s.st_mtime;
    22. ret = 1;
    23. }
    24. }
    25. filedate = localtime(&tm_t);
    26. tmzip->tm_sec = filedate->tm_sec;
    27. tmzip->tm_min = filedate->tm_min;
    28. tmzip->tm_hour = filedate->tm_hour;
    29. tmzip->tm_mday = filedate->tm_mday;
    30. tmzip->tm_mon = filedate->tm_mon ;
    31. tmzip->tm_year = filedate->tm_year;
    32. return ret;
    33. }
    34. /* create zip file
    35. taken from minizip, modified.
    36. */
    37. - (BOOL) createZip:(NSString*)filename withFiles:(NSMutableArray*)files withOutput:(BOOL)output {
    38. zipFile zf;
    39. int errclose,i,size_buf=0,err=0;
    40. void* buf=NULL;
    41. zf = zipOpen([filename fileSystemRepresentation],0);
    42. if (zf == NULL) {
    43. NSLog(@"error creating ZIP file = %@\n",filename);
    44. return FALSE;
    45. }
    46. size_buf = WRITEBUFFERSIZE;
    47. buf = (void*)malloc(size_buf);
    48. if (buf==NULL) {
    49. NSLog(@"Error allocating memory");
    50. return FALSE;
    51. }
    52. [progress startAnimation:self];
    53. for(i=0;i<=[files count]-1;i++) {
    54. if(![[NSFileManager defaultManager] fileExistsAtPath:[files objectAtIndex:i] isDirectory:nil]) continue;
    55. FILE * fin;
    56. int size_read;
    57. zip_fileinfo zi;
    58. if(output) {
    59. [textplay setStringValue:[NSString stringWithFormat:@"%@ %@",NSLocalizedString(@"exportfileaszip",nil),[[files objectAtIndex:i] lastPathComponent]]];
    60. [textplay setToolTip:[textplay stringValue]];
    61. [textplay display];
    62. }
    63. zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
    64. zi.tmz_date.tm_mday = zi.tmz_date.tm_min = zi.tmz_date.tm_year = 0;
    65. zi.dosDate = 0;
    66. zi.internal_fa = 0;
    67. zi.external_fa = 0;
    68. filetime([[files objectAtIndex:i] fileSystemRepresentation],&zi.tmz_date,&zi.dosDate);
    69. [[NSFileManager defaultManager] changeCurrentDirectoryPath:
    70. [[files objectAtIndex:i] stringByDeletingLastPathComponent]];
    71. err = zipOpenNewFileInZip(zf,[[[files objectAtIndex:i] lastPathComponent] fileSystemRepresentation],&zi,
    72. NULL,0,NULL,0,NULL,Z_DEFLATED,9);
    73. if (err != ZIP_OK) NSLog(@"error in opening %@ in zipfile\n",[files objectAtIndex:i]);
    74. else {
    75. fin = fopen([[files objectAtIndex:i] fileSystemRepresentation],"rb");
    76. if (fin==NULL) {
    77. err=ZIP_ERRNO;
    78. NSLog(@"error in opening %@ for reading\n",[files objectAtIndex:i]);
    79. }
    80. }
    81. if (err == ZIP_OK) {
    82. do {
    83. err = ZIP_OK;
    84. size_read = fread(buf,1,size_buf,fin);
    85. if (size_read < size_buf) {
    86. if (feof(fin)==0) {
    87. NSLog(@"error in reading %@\n",[files objectAtIndex:i]);
    88. err = ZIP_ERRNO;
    89. }
    90. }
    91. if (size_read>0) {
    92. err = zipWriteInFileInZip (zf,buf,size_read);
    93. if (err<0) NSLog(@"error in writing %@ in the zipfile\n", [files objectAtIndex:i]);
    94. }
    95. } while ((err == ZIP_OK) && (size_read>0));
    96. fclose(fin);
    97. if (err<0) err=ZIP_ERRNO;
    98. else {
    99. err = zipCloseFileInZip(zf);
    100. if (err!=ZIP_OK) NSLog(@"error in closing %@ in the zipfile\n", [files objectAtIndex:i]);
    101. }
    102. }
    103. }
    104. errclose = zipClose(zf,NULL);
    105. if (errclose != ZIP_OK) NSLog(@"error by closing ZIP file = %@\n",filename);
    106. free(buf);
    107. [progress stopAnimation:self];
    108. return TRUE;
    109. }
    Alles anzeigen

    Anpassen darf jeder selber :D , bin gerade zu faul dafür.

    Aufruf sollte auch klar sein oder?
    :wq! /dev/null
  • ich bekomm hier grad ne mittlere kriese! :sick:

    wenn ich mein projekt mit dem deployment build style compiliere bekomm ich beim linken folgende 3 zeilen und ich hab keine ahnung was ich machen soll. ich hab schon alle probiert.
    ich hab die lib neu ins projekt geholt.

    Quellcode

    1. ld: multiple definitions of symbol _createZip
    2. ld: multiple definitions of symbol _filetime
    3. ld: warning prebinding disabled because dependent library: /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit can't be searched


    ich hoffe du hattest das auch schonmal und weisst was man da machen muss


    sascha
  • Ups, da hab ich nur die hälfte gelesen. Du hast irgendwie was dopplet definiert, das liegt oft daran, dass man im Headerfile ein Fehler gemacht hat und das Objetct dann in alles Dateien die das Headerfile importieren exisiert. Überprüfe mal deine Header, wo die Funktion createZip definiert ist.
  • Original von macuser
    das kann ich dir auch nicht so genau sagen, da ich die files auch nur geschickt bekommen hab.
    ich weiss jetzt auch nicht wie ich die umschreiben soll. hast du da ne idee?


    Der Mann macht mich fertig :)
    Hat auf seine Homepage 8 Programme im Angebot und kann kein C.

    Egal, also

    ins Headerfile kommt nur

    uLong filetime(f, tmzip, dt);
    BOOL createZip(NSString* filename, NSMutableArray* files, BOOL output);

    das jetztig zipcontrol.h nennst du in zipcontrol.c um und fügst es deinem Projekt zu.

    Den Rest must du schon selbst machen :)