精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

帶你寫一個Linux 下的打包軟件 Tar

系統 Linux
相信你對 linux 的 .tar.gz 有點熟悉,這就是先 tar 打包(.tar 后綴),再對此 tar 文件用 gzip 壓縮(.tar.gz)的后綴名。

[[427101]]

相信你對 linux 的 .tar.gz 有點熟悉,這就是先 tar 打包(.tar 后綴),再對此 tar 文件用 gzip 壓縮(.tar.gz)的后綴名。

值得注意的是, tar 不是壓縮軟件,它只做把一堆文件/文件夾打包到一個文件(tar 文件)里的事情,而文件聯系,文件權限,相對的路徑等都會給你保存好。

一開始設計是 tar 跟 gzip 只做一件事情,各司其事,后來發現太麻煩了,于是就把壓縮功能整合到 tar 里了。

  1. Create a gzipped archive: 
  2.     tar czf target.tar.gz file1 file2 file3 

最近學習 OS 時寫了一個類似 tar 的項目,那么今天就趁熱打鐵簡單說一下如何寫一個打包軟件,這個軟件會將重復的文件內容通過 md5 比較,復用舊的內容。

基本單位 block

block 可以理解為文件系統的最小單位,分別有以下類型:

  • directory block,文件夾 block,存儲文件夾 meta 信息;
  • file block,文件 block,存儲文件 meta 信息;
  • data block,只用來存文件內容;

Directory block,注意的是 entry 里要有 fileindex 來存儲重復文件的 name 的下標。

同時,給 項目一個 root dir。

  1. typedef struct { 
  2.     char        name[SIFS_MAX_NAME_LENGTH]; // name of the directory 
  3.     time_t        modtime;    // time last modified <- time() 
  4.  
  5.     uint32_t        nentries;// 文件夾內的文件/文件夾數量 
  6.     struct { 
  7.         SIFS_BLOCKID    blockID;    // subdirectory 或者 file 的 blockID 
  8.         uint32_t    fileindex;    // 重復文件的不同名字 
  9.     } entries[SIFS_MAX_ENTRIES]; 
  10. } SIFS_DIRBLOCK; 

文件 Block,length 就是有多少 bytes 的文件內容,之后用來算有多少個 data block,firstblockID 記錄第一個數據 block 的 id,nfiles 記錄有多少重復內容的文件數量了,filenames 就是重復此文件 block 的文件內容的文件名字。

  1. typedef struct { 
  2.     time_t        modtime;    // time first file added <- time() 
  3.     size_t        length;        // length of files' contents in bytes 
  4.  
  5.     unsigned char    md5[MD5_BYTELEN];//the MD5 cryptographic digest (a summary) of the files' contents 
  6.     SIFS_BLOCKID    firstblockID;// the block number (blockID) of the files' first data-block 
  7.  
  8.     uint32_t        nfiles;        // n files with identical contents 
  9.     char        filenames[SIFS_MAX_ENTRIES][SIFS_MAX_NAME_LENGTH];// an array of each same file's name and its modification time
  10. } SIFS_FILEBLOCK; 

bitmaps數組,記錄了每個 block 的類型,有:文件、文件夾以及data block 三種類型。

通用函數

就讓大家看看關鍵函數好了:

讀 tar 后的文件的 meta 頭,記錄了 block 的大小( blocksize) 以及多少個 blocks。

  1. void read_vol_header(FILE *vol, SIFS_VOLUME_HEADER *header) { 
  2.     fread(header, sizeof(SIFS_VOLUME_HEADER), 1, vol); 
  3.     printf("header->blocksize %zu, header->nblocks %u\n", header->blocksize , header->nblocks); 

bitmap,每次操作 tar 文件都要讀的。

  1. void read_bitmap(FILE *vol, SIFS_BIT *bitmap, int nblocks) { 
  2.     int size = nblocks * sizeof(SIFS_BIT); 
  3.     fread(bitmap, size, 1, vol); 

root_block 同理,讀和寫啥東西都要從 root block、root dir 出發。

  1. void read_root_block(FILE *vol, SIFS_DIRBLOCK *dirblock){ 
  2.     fread(dirblock, sizeof(SIFS_DIRBLOCK), 1, vol); 
  3.     printf("read_root_block finish, dirblock.name: %s, dirblock.entrieds: %d, dirblock.modtime %ld\n", dirblock->name, dirblock->nentries,dirblock->modtime); 

路徑嘛,你懂的,./sifs_put volumn ~/res.txt /dirB/subdirB/subsubdir/newfileB,要讀的內容可以靠 read 函數解決,但是寫到 tar 文件里的就要手動解析遞歸查路徑了。

  1. void read_route_names(char* pathname, char** route_names, int *route_cnt) { 
  2.     char *dir; 
  3.     char *pathname_to_split = copyStr(pathname); 
  4.     strcpy(pathname_to_split, pathname); 
  5.     while ((dir = strsep(&pathname_to_split, "/")) != NULL) { 
  6.         route_names[*route_cnt] = copyStr(dir); 
  7.         (*route_cnt)++; 
  8.     } 

以上幾乎是 mkdir,rmdir,writefile,readfile,putfile 等等操作都要做的。

實現

然后,應該舉一個 readfile 的例子就可以做代表了。

  1. int recursive_dirinfo(SIFS_DIRBLOCK *cur_dir_block, char **route_names, int route_name_p, int route_cnt); 

實現:

  1. int recursive_dirinfo(SIFS_DIRBLOCK *cur_dir_block, char **route_names, int route_name_p, int route_cnt) { 
  2.     for(int i=0; i<cur_dir_block->nentries ; i++) { 
  3.         int blockid = cur_dir_block->entries[i].blockID; 
  4.         if(bitmap[blockid]==SIFS_DIR) { 
  5.             SIFS_DIRBLOCK dirblock; 
  6.             int start = sizeof(SIFS_VOLUME_HEADER) + header.nblocks*sizeof(SIFS_BIT); 
  7.             read_dir_block(vol, &dirblock, blockid * blocksize, start); 
  8.             if(strcmp(dirblock.name, route_names[route_name_p]) == 0) { 
  9.                 if(route_name_p+2 == route_cnt) { 
  10.                     return do_read_file(cur_dir_block, route_names[route_name_p+1], blockid); 
  11.                 } 
  12.                 return recursive_dirinfo(&dirblock, route_names, route_name_p+1, route_cnt); 
  13.             } 
  14.         } 
  15.     } 
  16.     return 1; 

以``./sifs_put volumn ~/res.txt /dirB/subdirB/subsubdir/newfileB 為例子,如果遞歸找到 subsubdir`這個文件夾 block,進行相應操作:

  • 寫文件就往 bitmap 一直找沒有用過的 block,夠寫文件就寫進去,文件夾更新一下信息。
  • 讀文件就是根據此文件夾 block,找里面的 newfileB
  1. int do_read_file(SIFS_DIRBLOCK *parent_dir, char *filename,  int parent_dir_block) { 
  2.     printf("do_find_file_info, filename %s\n", filename); 
  3.     for(int i=1; i<header.nblocks ; i++) { 
  4.         SIFS_FILEBLOCK fileblock; 
  5.         if(bitmap[i]==SIFS_FILE) { 
  6.             int start = sizeof(SIFS_VOLUME_HEADER) + header.nblocks*sizeof(SIFS_BIT); 
  7.             read_file_block(vol, &fileblock, i * blocksize, start); 
  8.             *nbytes = fileblock.length; 
  9.             int need_data_blocks = *nbytes / header.blocksize; 
  10.             if(strcmp(fileblock.filenames[0],  filename) == 0) { 
  11.                 for(int d_block_id = fileblock.firstblockID; d_block_id - i -1 < need_data_blocks; d_block_id++) { 
  12.                     read_data_block(vol, (char*)(*data)+(d_block_id - i -1), blocksize, d_block_id * header.blocksize, start); 
  13.                 } 
  14.                 return 0; 
  15.             } 
  16.  
  17.         } 
  18.     } 
  19.     return 1; 

而真實的 tar 自然更復雜,還要記錄用戶權限、用戶、group文件等等:

  1. struct posix_header 
  2. {                       /* byte offset */ 
  3.   char name[100];       /*   0 */   文件名 
  4.   char mode[8];         /* 100 */   用戶權限 
  5.   char uid[8];          /* 108 */   user id 
  6.   char gid[8];          /* 116 */   group id 
  7.   char size[12];        /* 124 */   文件大小 
  8.   char mtime[12];       /* 136 */   修改時間 
  9.   char chksum[8];       /* 148 */   校驗值 
  10.   char typeflag;        /* 156 */   文件類型標志 
  11.   char linkname[100];   /* 157 */   符號鏈接指向 
  12.   char magic[6];        /* 257 */    
  13.   char version[2];      /* 263 */ 
  14.   char uname[32];       /* 265 */   user name 
  15.   char gname[32];       /* 297 */   group name 
  16.   char devmajor[8];     /* 329 */   設備文件 major 
  17.   char devminor[8];     /* 337 */   設備文件 minor 
  18.   char prefix[155];     /* 345 */ 
  19.                         /* 500 */ 
  20. }; 
  21.  
  22. 文件類型標志定義,包含了所有 Unix 系統中的文件類型 
  23.  
  24. #define REGTYPE  '0'            /* regular file */ 
  25. #define LNKTYPE  '1'            /* link */ 
  26. #define SYMTYPE  '2'            /* reserved */ 
  27. #define CHRTYPE  '3'            /* character special */ 
  28. #define BLKTYPE  '4'            /* block special */ 
  29. #define DIRTYPE  '5'            /* directory */ 
  30. #define FIFOTYPE '6'            /* FIFO special */ 
  31. #define CONTTYPE '7'            /* reserved */ 

概覽如此,寫起來其實有點煩 - = -,有興趣的讀者可以寫寫。

責任編輯:武曉燕 來源: 山盡寫東西的cache
相關推薦

2021-06-26 16:24:21

Linux命令系統

2013-12-17 11:35:16

2009-10-21 11:16:23

Linux壓縮打包方法

2018-10-31 10:11:24

Python編程語言語音播放

2021-06-10 13:50:55

代碼開發數據庫

2021-08-03 09:07:39

GolangGrpc服務

2019-08-02 15:39:06

PythonLinuxJSON

2021-08-04 11:55:45

Python天氣查詢PySide2

2020-03-26 17:00:53

HashMapputJava

2015-09-09 13:29:17

FISHShellLinux

2020-08-25 07:29:48

2020-06-23 10:03:33

版本控制項目

2017-04-26 14:48:01

Chrome程序擴展

2021-09-07 07:34:42

CSS 技巧代碼重構

2021-09-08 08:36:50

ncursesLinux猜謎游戲

2023-04-07 15:45:13

Emojicode開源編碼語言

2010-04-19 17:21:36

Oracle寫文件

2014-02-14 09:37:01

JavascriptDOM

2017-11-27 15:17:24

PythonMonkey腳本

2017-09-20 16:39:31

云主機網站MySQL
點贊
收藏

51CTO技術棧公眾號

午夜精品一区二区三区三上悠亚| 国产精品中文字幕日韩精品| 亚洲性生活视频| 亚洲高清免费在线观看| 在线三级中文| 久久你懂得1024| 91美女片黄在线观| 日本一级一片免费视频| 成人看的羞羞网站| 精品剧情v国产在线观看在线| 波多野结衣家庭教师视频| 91精彩视频在线观看| 成人动漫在线一区| 国产精品美女在线| 国产一级特黄毛片| 99精品视频在线观看播放| 亚洲成人性视频| 日本中文字幕二区| 亚洲综合电影| 亚洲一区二区欧美| 伊人久久av导航| 欧美美女色图| 成人深夜福利app| 成人深夜直播免费观看| 福利网址在线观看| 在线播放精品| 欧美成年人视频网站| 老头老太做爰xxx视频| 露出调教综合另类| 日韩精品中文字幕在线一区| xxx国产在线观看| 台湾佬成人网| 狠狠色狠狠色综合日日五| 三级在线免费观看| 国产理论在线观看| 国产精品免费丝袜| 日韩国产美国| 精品亚洲综合| 2021国产精品久久精品| 国产一区二区三区四区五区在线| 99在线观看免费| 久久国产综合精品| 国产精品日韩电影| 国产美女www爽爽爽| 免费看的黄色欧美网站| 欧美激情三级免费| 欧美精品成人久久| 黄色一区二区三区四区| 欧美国产日本高清在线 | www久久精品| 国产精品久久精品视| 亚洲精品国产精| 国产aⅴ综合色| 99在线观看| 亚洲国产精品久久人人爱潘金莲 | 欧美激情亚洲| 欧美精品在线免费观看| 国产免费无码一区二区视频| 欧美在线三区| 欧美激情视频一区二区| 久久精品亚洲无码| 99精品视频免费观看视频| 97在线视频国产| 潘金莲一级淫片aaaaaa播放| 性高湖久久久久久久久| 日本一欧美一欧美一亚洲视频| 亚洲天堂一区在线观看| 久久中文字幕一区二区三区| 国产福利精品av综合导导航| 中文字幕网址在线| 国精产品一区一区三区mba桃花| 91久久在线播放| 亚洲av永久纯肉无码精品动漫| 成人在线视频一区| 欧美大香线蕉线伊人久久国产精品| 欧洲成人av| 日本一区二区三区国色天香 | 日韩精品一区二区三区三区免费| 色哟哟网站在线观看| 老司机凹凸av亚洲导航| 亚洲欧美精品suv| 午夜国产福利视频| 欧美黄色大片网站| 欧美综合在线第二页| 伊人免费在线观看| 国产激情一区二区三区四区| 精品伊人久久大线蕉色首页| av小片在线| 亚洲国产精品一区二区尤物区| 国产午夜伦鲁鲁| 黄色精品视频网站| 精品国产制服丝袜高跟| 谁有免费的黄色网址| 无需播放器亚洲| 18一19gay欧美视频网站| 亚洲一级av毛片| av一区二区三区在线| 亚洲一区二区在| bbw在线视频| 在线播放中文字幕一区| 亚洲国产精品自拍视频| 先锋资源久久| 欧美专区日韩视频| 性生活视频软件| 欧美激情一区三区| 国产av麻豆mag剧集| 欧美videos粗暴| 亚洲激情在线观看| 国产一区二区精彩视频| 丝袜亚洲精品中文字幕一区| 91中文字幕在线| 久久久久久女乱国产| 一片黄亚洲嫩模| 国产色视频在线播放| 欧美综合自拍| 欧美激情按摩在线| 国产精品久久婷婷| 国产日本欧洲亚洲| 国模吧无码一区二区三区| 欧美成年网站| 日韩视频中文字幕| 免费污污视频在线观看| 成人福利在线看| 日韩a级黄色片| 国产精品久久久久久久久久久久久久久 | 图片小说视频色综合| 国产精品av免费在线观看| 好吊视频一区二区三区| 亚洲欧美日韩中文播放| 亚洲最大成人在线观看| 国产成人一区| 热久久免费国产视频| 少妇高潮一区二区三区69| 一区二区三区色| 久久精品久久99| 一区二区三区网站| 91久久久久久久一区二区| 麻豆最新免费在线视频| 欧美日韩一卡二卡三卡 | 欧美做受高潮电影o| 好吊视频一区二区三区| 亚洲综合一区在线| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 91精品黄色片免费大全| 五月婷婷综合激情网| 麻豆精品蜜桃视频网站| 婷婷五月色综合| 成人国产精品一区二区免费麻豆| 亚洲一品av免费观看| 日韩黄色片网站| 国产午夜久久久久| 日本美女高潮视频| 色狮一区二区三区四区视频| 国产狼人综合免费视频| 在线观看免费高清完整| 欧美日韩国产a| 超碰手机在线观看| 成人精品高清在线| 欧美日韩国产精品激情在线播放| 蜜桃国内精品久久久久软件9| 日本免费久久高清视频| 在线观看免费版| 欧美一区二区在线免费播放| 性欧美videos| 成人精品视频一区二区三区尤物| 男人的天堂狠狠干| 亚洲精品一级二级三级| 国产精品久久久久久av福利软件| 日韩理伦片在线| 欧美一区二区三级| 国产在线精品观看| www国产成人免费观看视频 深夜成人网| www黄色av| 99久久夜色精品国产亚洲狼| 91手机在线视频| av女在线播放| 伊人伊成久久人综合网小说| 国产欧美久久久| 性感美女极品91精品| 中文字幕免费视频| 国产麻豆成人精品| 青青草原成人网| 91久久夜色精品国产按摩| 99re国产| 成人在线网站| 欧美多人爱爱视频网站| 免费在线黄色网址| 91精品国产综合久久香蕉麻豆| 国产精品16p| 国产精品无码永久免费888| 久久黄色一级视频| 免费永久网站黄欧美| 亚洲免费av网| 亚洲最好看的视频| 91麻豆国产语对白在线观看| 热色播在线视频| 久久在精品线影院精品国产| 青青草视频在线免费观看| 欧美精品久久99| 国模无码国产精品视频| 久久精品亚洲国产奇米99| 日韩精品――色哟哟| 日韩高清一区二区| 精品视频免费在线播放| 欧美1区免费| 色女人综合av| 日韩精选在线| 成人午夜影院在线观看| 亚洲成人精品综合在线| 日本国产精品视频| 91美女主播在线视频| 美女av一区二区| av女优在线| 亚洲精品自拍第一页| 性色av蜜臀av| 欧美日韩高清在线播放| 自拍偷拍18p| 天天av天天翘天天综合网 | 香蕉乱码成人久久天堂爱免费| 亚洲波多野结衣| 欧美激情一区二区| 中文字幕精品视频在线| 国产精品一二三| 中文字幕亚洲影院| 麻豆精品在线播放| 亚洲综合色在线观看| 久久精品日产第一区二区| 五月丁香综合缴情六月小说| 欧美日韩国产在线一区| 影音先锋欧美在线| 日韩欧美大片| 亚洲国产成人不卡| 日韩成人影院| 婷婷四房综合激情五月| 欧美日韩国产一区二区三区不卡| 蜜桃视频在线观看成人| 同性恋视频一区| 精品无人乱码一区二区三区的优势| 66精品视频在线观看| 亚洲综合av影视| 麻豆一二三区精品蜜桃| 亚洲最大av在线| 日韩中文在线| 成人欧美一区二区三区视频| 视频一区中文字幕精品| 成人激情直播| gogo人体一区| 精品日本一区二区| 日韩丝袜视频| 蜜桃视频日韩| 色喇叭免费久久综合| 综合视频在线观看| 亚洲网色网站| 中国丰满熟妇xxxx性| 亚洲欧洲另类| 黄色a级片免费| 日本色综合中文字幕| 一级片视频免费观看| 精品亚洲aⅴ乱码一区二区三区| 污网站在线免费| 国产乱子伦视频一区二区三区| 日批免费观看视频| 99久久99久久精品免费看蜜桃| 久久久精品人妻无码专区| 久久精品亚洲精品国产欧美 | 日韩欧美在线国产| 中文字幕有码视频| 91精品国产综合久久蜜臀| 精品免费久久久| 精品亚洲一区二区| 97电影在线看视频| 欧美成人四级hd版| 小视频免费在线观看| 国产精品老女人精品视频| 激情不卡一区二区三区视频在线| 成人免费视频网站| 国产剧情在线观看一区| 在线一区高清| 99精品热6080yy久久| 九色91popny| 国产高清不卡一区| 丝袜美腿中文字幕| 亚洲品质自拍视频网站| 国产九色在线播放九色| 精品视频一区二区不卡| 内射无码专区久久亚洲| 亚洲一级片在线看| 蜜桃传媒在线观看免费进入 | 国产欧美三级电影| 日韩福利在线| 亚洲午夜在线| 色片在线免费观看| av综合在线播放| 永久免费未视频| 色综合中文字幕国产| 国产手机av在线| 亚洲女人天堂视频| 欧美女同一区| 国产欧美一区二区三区视频| 六月丁香久久丫| 超碰超碰超碰超碰超碰| 日本免费新一区视频| 精品人妻伦一二三区久| 成人免费在线观看入口| 精品国产乱子伦| 精品久久久久久久人人人人传媒| 香港伦理在线| 日韩免费观看网站| 欧美jizz19性欧美| 欧美 日韩 国产精品| 久久福利精品| 漂亮人妻被黑人久久精品| 最新欧美精品一区二区三区| 亚洲黄网在线观看| 亚洲国产精品字幕| 影音先锋男人资源在线| 国产美女主播一区| 国产一区网站| 成年人观看网站| 99综合电影在线视频| 激情综合五月网| 欧美电影在线免费观看| 国产精品影院在线| 琪琪第一精品导航| 日韩三级视频| 浮妇高潮喷白浆视频| 成人综合婷婷国产精品久久免费| 欧美特级一级片| 欧美日本精品一区二区三区| 成人动漫在线免费观看| 日韩av电影中文字幕| 欧美在线关看| 久久久999视频| 91香蕉视频mp4| 日韩 欧美 亚洲| 欧美精品一区二区不卡| a级片免费在线观看| 91成人免费视频| 国产综合欧美| 黄色av电影网站| 亚洲观看高清完整版在线观看| a天堂在线视频| 欧美噜噜久久久xxx| 视频亚洲一区二区| 丝袜人妻一区二区三区| k8久久久一区二区三区| 亚洲一区欧美在线| 精品亚洲男同gayvideo网站| 欧美成人影院| 日韩av在线电影观看| 日韩国产精品久久久| 一本在线免费视频| 欧美人妇做爰xxxⅹ性高电影| 男女啪啪在线观看| 亚洲最大成人在线| 欧美色一级片| 日本护士做爰视频| 色综合久久99| eeuss影院www在线观看| 91久久久久久| 激情久久综合| 手机av免费看| 欧美高清hd18日本| 欧美黑人猛交| 欧美日韩综合另类| 久久成人精品无人区| 在线免费日韩av| 亚洲国产欧美一区二区三区久久| 亚洲黄色中文字幕| 亚洲视频在线二区| 懂色av一区二区在线播放| 五月婷婷亚洲综合| 搡老女人一区二区三区视频tv| 国产精品美女久久久久| 成人性生活视频免费看| 久久精品人人做| 国产女人18毛片18精品| 韩国美女主播一区| 日韩久久电影| 制服丝袜av在线| 在线免费亚洲电影| 污视频免费在线观看| 另类欧美小说| 国产美女视频一区| 免费污污视频在线观看| 免费91麻豆精品国产自产在线观看 | 亚洲国产日本| 国产又黄又粗视频| 精品日韩在线观看| 日韩欧美一区二区三区免费观看 | 日韩精品久久久毛片一区二区| 韩国一区二区视频| 亚洲欧美精品一区二区三区| 久久天天躁狠狠躁夜夜av| 一本色道久久综合亚洲精品酒店| 不用播放器的免费av| 狠狠操狠狠色综合网| 69xxx在线| 深田咏美在线x99av| 不卡的av在线|