“不适当的文件类型或格式”

时间:2013-07-21 07:13:40

标签: c operating-system archive

我正在尝试使用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;
}

2 个答案:

答案 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结构中的所有字段都填充了空格,不是以空字符结尾的字符串。
  • 除非您准备更新符号表(包括必要时添加一个)并重写整个文件,否则您必须确保文件名不超过15个字符。
  • 每个文件名后面必须紧跟一个/字符(后面不能跟空。再次,字段的其余部分用空格填充。)
  • 您永远不会初始化ar_fmag结构的ar_hdr字段。这需要初始化为特定值。
  • 编写标题后,需要编写文件的实际内容。
  • 某些引用表明在写入文件内容时,必须写入偶数个字节。如果文件大小是奇数,则应将单个\n附加为填充(并且标题中记录的文件大小不会增加以包括填充字节)。