c ++ - Kan ikke tilføje filer til .zip-filen

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøgte med prøvekode nedenfor (fra Hvordan bruger jeg Minizip (på Zlib)?).


Det virker ikke, når du tilføjer filer fra en bestemt mappe. zipfile bliver skabt, men intet i den. Jeg forstår ikke, hvad jeg mangler.
Jeg vil zip alle filer i mappen "c:\temp1\*".


Hvis jeg hardkodes filnavnet, som vist i nedenstående 2 linjer, så får de tilføjet zip.


const char* Filenames[] = {"Readme.txt", "foo.bin"};
unsigned int nCount = sizeof( Filenames )/sizeof( char* );


Her er min kode:


#include "stdafx.h"
#include <vector>
#include <string>
#include <fstream>
#include <windows.h>
#include <comdef.h> 

#include <Shlwapi.h>
#pragma comment (lib, "Shlwapi.lib")

#include "zlib-1.2.11zlib.h"
#include "zlib-1.2.11zip.h"

using namespace std;


wchar\_t *convertCharArrayToLPCWSTR(const char* charArray)
{
    wchar\_t* wString=new wchar\_t[4096];
    MultiByteToWideChar(CP\_ACP, 0, charArray, -1, wString, 4096);
    return wString;
}

std::wstring CombinePaths(std::wstring const &pattern, LPCWSTR filename) {
    std::wstring tmp(pattern);
    tmp.push\_back('');
    PathRemoveFileSpec(&tmp[0]);
    std::wstring retVal(MAX\_PATH, '');
    PathCombine(&retVal[0], tmp.c\_str(), filename);
    return retVal.c\_str();
}

int zip()
{
   WIN32\_FIND\_DATA FindFileData;
   HANDLE hFind;

    zipFile myZip = zipOpen64("MyTest.zip", APPEND\_STATUS\_CREATE);

    std::wstring myDir(L"C:\temp1\*");

    hFind = FindFirstFile(myDir.c\_str(), &FindFileData);

    typedef std::vector<std::wstring> listofFiles;
    listofFiles ff;
   // List all the files in the directory
   do
   {
       std::wstring fullPath = CombinePaths(myDir, FindFileData.cFileName);
       ff.push\_back(fullPath);
   }
   while (FindNextFile(hFind, &FindFileData) != 0);
   FindClose(hFind);


   bool myreturn = true;

    // add files to the zip file
   for ( unsigned int i = 0; i < ff.size(); i++ )
    {

        ifstream file(ff[i].c\_str(), ios::binary | ios::in);
        \_bstr\_t b(ff[i].c\_str());
        const char* filename = b;

        FILE *stream;
        errno\_t err = fopen\_s(&stream, filename, "r");
        if (file.is\_open() )
        {
            file.seekg(0, ios::end);
            size\_t size = file.tellg();
            file.seekg(0, ios::beg);

            std::vector<char> buffer(size);
            if (size == 0 || file.read(&buffer[0], size))
            {
                zip\_fileinfo zi = {0};
                if (ZIP\_OK == zipOpenNewFileInZip(myZip, filename, &zi, NULL, 0, NULL, 0, NULL, Z\_DEFLATED, Z\_DEFAULT\_COMPRESSION))
                {
                    if (zipWriteInFileInZip(myZip, size == 0 ? "" : &buffer[0], (unsigned int) size))
                        myreturn = false;

                    zipCloseFileInZip(myZip);
                    file.close();
                    continue;

                }
                else
                {
                    file.close();
                    return ZIP\_ERRNO;
                }
            }
             file.close();
        }
        if (stream != NULL)
            fclose(stream);
    }
   ff.clear();

   zipCloseFileInZip( myZip );
   if (zipClose(myZip, 0))
       return ZIP\_BADZIPFILE;

   return ZIP\_OK;
}
void unzip()
{
}
int \_tmain(int argc, \_TCHAR* argv[])
{
    zip();

    unzip();
    return 0;
}

Bedste reference