2013-07-21 67 views
0

我想添加一個新的文件成員與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

也許不會設置'ar_fmag'結構成員(請參閱http://docs.oracle.com/cd/E19082-01/819-2242/ar。h-3head/index.html) - 我沒有'ar'的經驗,所以這是一個猜測。此外,使用'od'分析輸出文件以檢查字節是否符合您的期望可能很有用。 – imp25

回答

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); 
} 
+0

謝謝你的幫助。我添加了你的建議,並在ar_hdr之後添加了文件的內容,但是我仍然得到相同的錯誤。我會發布我的新問題。 – user2203774

0

user2203774,我要再次重申:你有不良的記錄文件工作格式即不規範。知道正確文件格式的唯一方法是(a)研究我在另一個問題中提供的文檔鏈接,並(b)分析您擁有的檔案文件的樣本,以確定格式是否符合此類文檔如你所見。可能性是文件格式相似,但不完全相同。那麼,你需要弄清楚有什麼不同。一旦你這樣做了,創建你自己的文件格式文件,並解決這個問題。

還要注意,第一也是最簡單的調試步驟是「比較相當於產生了什麼我的程序通過ar的生成。他們如何不同?爲什麼?」(該od -c命令非常有用這裏,或副作用並排的十六進制查看器)。

幾點:

  • 神奇的頭字符串("!<arch>\n")唯一無二的文件的開頭,而不是在每一個記錄的開始。
  • ar_hdr結構中的所有字段都用空格填充,並且不是以空字符結尾的字符串。
  • 除非您準備更新符號表(包括必要時添加一個)並重寫整個文件,否則您必須確保文件名不超過15個字符。
  • 每個文件名必須緊跟一個/字符(必須不能跟空。同樣,用空格填充字段的其餘部分。)
  • 你永遠初始化ar_hdr結構的ar_fmag場。這需要初始化爲特定的值。
  • 編寫標題後,需要編寫文件的實際內容。
  • 有些參考文獻指出寫入文件內容時,必須寫入偶數個字節。如果文件大小是奇數,則應該附加一個單獨的\n作爲填充(並且記錄在文件頭中的文件大小不會遞增以包含填充字節)。
相關問題