使用zip_stat_index(za,i,0,&sb)获取访问冲突错误

时间:2018-07-18 06:14:28

标签: c++ visual-studio c++11 zip libzip

我正在尝试使用Visual Studio 2017中的 libzip 库提取 zip 文件。我编写了C ++程序来提取 .zip 文件。

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <limits.h>
#include <io.h>
#include <zip.h>
#include <direct.h>
#include <windows.h>

static void safe_create_dir(const char *dir)
{
    if (_mkdir(dir) < 0) {
        if (errno != EEXIST) {
            perror(dir);
            exit(1);
        }
    }
}

int main(int argc, char *argv[])
{
    const char *archive;
    struct zip *za;
    struct zip_file *zf;
    struct zip_stat sb;
    char buf[100];
    int err;
    int i, len;
    int fd;
    long long sum;

    if (argc != 2) 
    {
        return 1;
    }

    archive = argv[1];

    if ((za = zip_open(archive, 0, &err)) == NULL) 
    {
        zip_error_to_str(buf, sizeof(buf), err, errno);
        return 1;
    }

    for (i = 0; i < zip_get_num_entries(za, 0); i++) 
    {
        if (zip_stat_index(za, i, 0, &sb) == 0) 
        {
            len = strlen(sb.name);
            if (sb.name[len - 1] == '/') {
                safe_create_dir(sb.name);
            }
            else 
            {
                zf = zip_fopen_index(za, i, 0);
                fd = _open(sb.name, O_RDWR | O_TRUNC | O_CREAT, 0644);

                sum = 0;
                while (sum != sb.size) 
                {
                    len = zip_fread(zf, buf, 100);
                    _write(fd, buf, len);
                    sum += len;
                }
                _close(fd);
                zip_fclose(zf);
            }
        }
        else 
        {
            printf("File[%s] Line[%d]/n", __FILE__, __LINE__);
        }
    }
    zip_close(za);

    return 0;
}

但是,我在zip_stat_index(za, i, 0, &sb)函数中遇到访问冲突错误:

Exception thrown at 0x00000001 in Application.exe: 0xC0000005: Access violation executing location 0x00000001.

为什么会出现此错误?我在这里想念什么?

0 个答案:

没有答案