簡體   English   中英

miniz C無法使用絕對路徑壓縮文件

[英]miniz C can't zip file with absolute path

我正在使用miniz在Windows上的C中創建.zip文件。

我使用該文檔生成了我的代碼,並且可以正常工作。 僅當我提供zip函數的相對路徑時,才能使用所需的文件創建檔案。

我不明白為什么“ file_name”變量必須像“ ../test/file.txt”而不是“ C:/../ test / file.txt”一樣。

if (!(status = mz_zip_add_mem_to_archive_file_in_place(archive, file_name, data, strlen(data) + 1, s_pComment,
                                                           (uint16) strlen(s_pComment), MZ_BEST_COMPRESSION)))
        return (merror("add file to archive failed !!"));

在使用此功能之前,我先打開文件,將數據放入其中,然后調用zip_function。

    if (!(src = fopen(file_name, "r")))
        return (merror("can't open this file"));
    char *line = NULL;
    char *data= NULL;
    size_t n = 0;
    getline(&line, &n, src);
    data= strdup(line);
    while (getline(&line, &n, src) != -1){
        data = realloc(save, sizeof(char) * (strlen(data) + strlen(line)) + 1);
        data = strcat(data, line);
    }
    fopen(src);

因此,我用存檔名稱,文件名(具有絕對路徑)和其中的數據(char *格式)來調用zip函數。

這是“完整”的代碼:函數init_zip是我的程序調用的第一個函數。 arg參數是我要創建的存檔名稱(可以是絕對路徑,可以使用), args參數是我要添加到存檔文件中的差異文件的名稱(相對路徑可以使用,但不是絕對的)。

typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint;

static const char *s_pComment = "";

static int isDirectory(const char *path) {
    struct stat statbuf;
    if (stat(path, &statbuf) != 0)
        return 0;
    return S_ISDIR(statbuf.st_mode);
}

int get_data(const char *archive, const char *file)
{
    FILE               *src;

    if (!isDirectory(file)) {
        if (!(src = fopen(file, "r")))
            return (merror("can't open this file"));
        char *line = NULL;
        char *save = NULL;
        size_t n = 0;
        getline(&line, &n, src);
        save = strdup(line);
        while (getline(&line, &n, src) != -1) {
            save = realloc(save, sizeof(char) * (strlen(save) + strlen(line)) + 1);
            save = strcat(save, line);
        }
        printf("compressing %s ..\n", file);
        if (m_compress(archive, file, save))
            return (merror("compress function failed"));
        printf(("\tOK.\n"));
        fclose(src);
    }
    else
    {
        DIR                *dir;
        struct dirent      *entry;
        char                *new_file;

        if (!(dir = opendir(file)))
            return (merror("opendir failed: ", "wrong directory path in init_zip.get_data command : ", file, NULL));
        while ((entry = readdir(dir)) != NULL)
        {
            if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) {
                new_file = add_path(file, entry->d_name);
                get_data(archive, new_file);
            }
        }
        if (new_file)
            free(new_file);
        closedir(dir);
    }
}

int init_zip(const char *arg, const char **args)
{
    printf("\nZIP cmd:\n >");
    remove(arg);
    for (int counter = 0; args[counter]; ++counter)
    {
       get_data(arg, args[counter]);
    }
    printf("All the files are added to %s archive file.\n", arg);
    return (0);
}

int m_compress(const char *archive, const char *file_name, const char *data)
{
    mz_bool status;

    if (data)
        if (!(status = mz_zip_add_mem_to_archive_file_in_place(archive, file_name, data, strlen(data) + 1, s_pComment,
                                                               (uint16) strlen(s_pComment), MZ_BEST_COMPRESSION)))
            return (merror("add file to archive failed !!"));
    else
        if (!(status = mz_zip_add_mem_to_archive_file_in_place(archive, file_name, NULL, 0, "no comment", (uint16)strlen("no comment"), MZ_BEST_COMPRESSION)))
            return (merror("add directory to archive failed !!"));

    return (0);
}

這是get_data()使用的add_path()函數:

char          *add_path(const char *str1, const char *str2)
{
  char *path;

  path = malloc(sizeof(char) * (strlen(str1) + 1 + strlen(str2) + 1));
  path = strcpy(path, str1);
  path = strcat(path, "/");
  path = strcat(path, str2);
  return (path);
}

有人知道嗎?

如果沒有幫助,則應查找源。 Githubminiz中的代碼之后,文件miniz_zip.c第4297行我看到:

mz_bool mz_zip_add_mem_to_archive_file_in_place(...

調用函數mz_zip_writer_validate_archive_name來檢查第二個文件名,條件是該文件名不能以驅動器號開頭(第3069行),如果是,則返回FALSE,錯誤設置為MZ_ZIP_INVALID_FILENAME

至於為什么第二個文件名可能不是絕對路徑,我不知道。 如果這對您很重要,則可以從Github獲取代碼並對其進行修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM