tar(tapearchive)是unix和類unix系統上檔案打包工具,可以將多個檔案合併為乙個檔案,使用tar工具打出來的包稱為tar包。一般打包後的檔名字尾為」.tar」,也可以為其它。tar代表未被壓縮的tar檔案,已被壓縮的tar檔案則追加壓縮檔案的副檔名,如經過gzip壓縮後的tar檔案,擴充套件名為」.tar.gz」。在windows系統中用winrar也可以解壓縮開啟tar包。tar檔案格式已經成為posix標準,最初是posix.1-1998,目前是posix.1-2001.
tar中的資料都是以512位元組為單位。tar由兩部分組成即頭部+內容,其中頭部是512位元組的頭部結構,內容是存放乙個檔案內容的地方。
tar檔案格式的詳細介紹可以參考:
通過執行以下命令生成測試tar包:
tar -cvf test.tar *
test.tar中包含兩個檔案blog_info.txt和github_info.txt.
其中blog_info.txt檔案內容如下:
name: fengbingchun
address:
github_info.txt檔案內容如下:
name: fengbingchun
address:
實現**tar.hpp:
#ifndef fbc_messy_test_tar_hpp_
#define fbc_messy_test_tar_hpp_
#include #include /* reference:
/* tar header block, from posix 1003.1-1990. */
/* posix header. */
typedef struct posix_header
tar_posix_header; /*
location size field
0 100 file name
100 8 file mode
108 8 owner's numeric user id
116 8 group's numeric user id
124 12 file size in bytes
136 12 last modification time in numeric unix time format
148 8 checksum for header block
156 1 link indicator (file type)
157 100 name of linked file*/
#define tmagic "ustar" /* ustar and a null */
#define tmaglen 6
#define tversion "00" /* 00 and no null */
#define tverslen 2
/* values used in typeflag field. */
#define regtype '0' /* regular file */
#define aregtype '\0' /* regular file */
#define lnktype '1' /* link */
#define symtype '2' /* reserved */
#define chrtype '3' /* character special */
#define blktype '4' /* block special */
#define dirtype '5' /* directory */
#define fifotype '6' /* fifo special */
#define conttype '7' /* reserved */
class tarfile ;
int test_tar();
#endif // fbc_messy_test_tar_hpp_
tar.cpp:
#include "tar.hpp"
tarfile::tarfile(const char* tar_name)
: file(nullptr), size(0)
tarfile::~tarfile()
file_names.clear();
file_sizes.clear();
file_data_start_addrs.clear();}
bool tarfile::isvalidtarfile()
; unsigned char buf[block_size];
tar_posix_header* header = (tar_posix_header*)buf;
memset(buf, 0, block_size);
fseek(file, 0, seek_end);
size = ftell(file);
fseek(file, 0, seek_set);
if (size % block_size != 0)
size_t pos;
while (1) ;
sscanf(header->size, "%lo", &file_size);
size_t file_block_count = (file_size + block_size - 1) / block_size;
switch (header->typeflag)
pos += file_block_count * block_size;
fseek(file, pos, seek_set);
}fseek(file, 0, seek_set);
return true;}
std::vectortarfile::getfilenames()
bool tarfile::getfilecontents(const char* file_name, char* contents)
}return flag;}
size_t tarfile::getfilesize(const char* file_name);
for (int i = 0; i < file_names.size(); i++)
}return file_size;}
size_t tarfile::gettarsize() //
int test_tar()
; tarfile tarfile(tar_file_path.c_str());
bool is_valid_tar_file = tarfile.isvalidtarfile();
if (!is_valid_tar_file)
fprintf(stderr, "tar file size: %d byte\n", tarfile.gettarsize());
std::vectorfile_names = tarfile.getfilenames();
fprintf(stderr, "tar file count: %d\n", file_names.size());
for (auto name : file_names)
return 0;
}
測試結果如下:
解析tar命令
tar命令的用法如下。摘自 鳥哥的私房菜 tar zxcvfpp tfile sfile 引數說明 z 是否同時具有 gzip 的屬性?x 解開乙個壓縮檔案的引數指令!t 檢視 tarfile 裡面的檔案!c 建立乙個壓縮檔案的引數指令 v 壓縮的過程中顯示檔案!f 使用檔名,請留意,在 f 之後要...
c語言提取tar包內容
tar檔案 以一定方式將多個檔案合併成tar檔案,不對檔案進行壓縮,tar檔案格式 很 簡單,每個檔案前面 512位元組的header,並且將所有檔案疊放在一起 header1 file1 header2 file2 header3 file3 解包就是讀取檔案頭得到檔案大小,然後讀取出檔案就行了 ...
C C 解析tar檔案
3 tar檔案解包實現 4 參考文章 tar檔案是一種打包檔案 非壓縮檔案 在電腦上我們經常能看到的一種檔案,是將多個檔案打包成乙個檔案,以方便拷貝和傳輸。在嵌入式系統中,tar檔案也是使用較為廣泛。假設我們現在有乙個這樣的控制系統,乙個主控裝置管理器,下面通過乙太網 rs232 rs485連線著多...