как напечатать только имя файла - PullRequest
0 голосов
/ 30 октября 2011

Я читаю в архивном файле. Архивный файл, созданный с помощью команды ar в unix. Когда я помещаю файл, он говорит это

!<arch>
correct.c/      1319871022  1000  1000  100664  0         `
hello.c/        1319871007  1000  1000  100664  0         `
hi.c/           1319870999  1000  1000  100664  0         `
make.c/         1319871028  1000  1000  100664  0         `
pie.c/          1319871015  1000  1000  100664  0         `
three.c/        1319871035  1000  1000  100664  0         `

То, что я хочу отобразить, это просто

correct.c
hello.c
hi.c
make.c
pie.c
three.c

Вот код, относящийся к этой части. archive_name - это имя файла. filestr - это строка, которая может содержать до 30 chars, а файл имеет значение FILE *file, но объявлено выше.

file = fopen(archive_name, "r");
if(file == NULL) perror("\nError opening file\n");
else {
    while( fgets(filestr, 10, file) != NULL )
        printf("%s", filestr);

fclose(file);

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 30 октября 2011

Как вы уже видели, архив начинается с "!"(сопровождается новой строкой).

После этого у вас есть примерно такая структура:

#pragma pack(1) // use whatever your compiler wants to ensure against padding.
struct file_header { 
    char filename[16];
    char timestamp[11];
    char ownerID[5];
    char groupID[5];
    char filemode[8];
    char filesize[9];
    char magic[2];
};

Для каждого файла в архиве есть одно, так что если вы хотитечтобы сбросить только имена файлов, вы можете (по крайней мере, в теории - продолжить чтение) пропустить заголовок, затем прочитать их и отобразить имена файлов.

Хотя есть одна проблема: как вы можете видеть, этопозволяет только 16 байтов для каждого имени файла, что часто недостаточно.Есть разные способы справиться с этим, и (к сожалению) они варьируются от одной реализации ar к другой, поэтому почти невозможно сказать вам, как получить настоящие имена файлов.

Вероятно, наиболееочевидным решением было бы использовать popen для запуска ar (и надеяться, что он соответствует формату архивных файлов, на которые вы должны смотреть).

...