我正在尝试使用ar_hdr格式添加新文件成员,并将其放在存档中的最后一个元素之后。我的代码编译,但是当我想用ar -t命令查看文件名时,我收到一条错误消息:ar:hello.a:文件类型或格式不合适。有人可以看看我的代码,并给我一些如何解决它的提示?感谢。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/utsname.h>
#include <ctype.h>
#include <string.h>
#include <ar.h>
#define BLOCKSIZE 1
int main (int argc, char **argv)
{
char *archive = argv[1];
char *read_file = argv[2];
int in_fd;
int out_fd;
char title[] = ARMAG; //constant define in ar.h
char buf[BLOCKSIZE];
int num_read;
int num_written;
struct stat stat_file;
struct ar_hdr my_ar;
//open read_file (i.e., text file)
if (stat(read_file, &stat_file) == -1){
perror("Error in Stat");
exit(-1);
}
//assign file info to struct dhr (my_ar)
sprintf(my_ar.ar_name, "%s", read_file);
sprintf(my_ar.ar_date, "%ld", stat_file.st_mtimespec.tv_sec);
sprintf(my_ar.ar_uid, "%i", stat_file.st_uid);
sprintf(my_ar.ar_gid, "%i", stat_file.st_gid);
sprintf(my_ar.ar_mode, "%o", stat_file.st_mode) ;
sprintf(my_ar.ar_size, "%lld", stat_file.st_size) ;
//0666 - open archive
out_fd = open(archive, O_CREAT | O_WRONLY | O_APPEND, 0666);
if (out_fd == -1) {
perror("Canot open/create output file");
exit(-1);
}
//write my_ar to archive
num_written = write(out_fd, title, sizeof(title));
num_written = write(out_fd, &my_ar, sizeof(my_ar));
printf("\n");
return 0;
}
答案 0 :(得分:0)
title
应该只在文件中出现一次。如果要将文件附加到存档,则只需要为新文件编写ar_hdr
,然后写入文件的内容。
因此您需要检查文件是否已存在。如果没有,并且您正在创建新存档,则需要先编写title
。如果确实存在,请跳过该步骤。由于您是在追加模式下打开文件,因此您可以使用lseek()
判断它是否为新文件:
off_t curpos = lseek(out_fd, SEEK_CUR, 0); // Get current position
if (curpos == 0) { // At beginning, it must be a new file
num_written = write(out_fd, ARMAG, SARMAG);
}
答案 1 :(得分:0)
user2203774,我将重新进行迭代:您正在使用未标准化的文档格式不佳的文档格式。了解正确文件格式的唯一方法是(a)研究我在其他问题中提供的文档链接,以及(b)分析您拥有的存档文件的样本,以确定格式是否符合此类文档就像你一样。可能性是文件格式相似,但不相同。那么,你需要弄清楚差异是什么。完成后,创建自己的文件格式文档,然后再进行操作。
另请注意,第一个也是最简单的调试步骤是&#34; 将我的程序生成的内容与ar
生成的等效项进行比较。他们有什么不同?为什么&#34; (od -c
命令在这里很有用,或者是并排的十六进制查看器。)
有几点:
"!<arch>\n"
)仅出现在文件的开头,而不是每个记录的开头。ar_hdr
结构中的所有字段都填充了空格,不是以空字符结尾的字符串。/
字符(后面不能跟空。再次,字段的其余部分用空格填充。)ar_fmag
结构的ar_hdr
字段。这需要初始化为特定值。\n
附加为填充(并且标题中记录的文件大小不会增加以包括填充字节)。