gpt4 book ai didi

c - miniz C 无法使用绝对路径压缩文件

转载 作者:行者123 更新时间:2023-11-30 14:50:33 25 4
gpt4 key购买 nike

我正在 Windows 上使用 miniz 用 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 是我的程序调用的第一个函数。 args 参数是我想要创建的存档名称(它可以是绝对路径并且可以工作),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);
}

有人知道这方面的情况吗?

最佳答案

如果没有任何帮助,那么您应该查找来源。遵循 miniz on Github 中的代码,文件 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 获取代码并进行修改。

关于c - miniz C 无法使用绝对路径压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48945307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com