精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一本色道久久综合亚洲精品婷婷| 欧美在线性爱视频| 亚洲色图偷拍视频| 青青在线视频| 国产欧美日韩激情| 91久久偷偷做嫩草影院| 天天干天天干天天干天天| 日韩在线观看电影完整版高清免费悬疑悬疑| 欧美浪妇xxxx高跟鞋交| 亚洲熟妇无码另类久久久| av一本在线| 国产+成+人+亚洲欧洲自线| 91超碰中文字幕久久精品| 国产真人真事毛片视频| 欧美色图婷婷| 欧美一区二区三区免费观看视频| 自慰无码一区二区三区| 成人日批视频| 国产欧美一区二区精品仙草咪| 99在线高清视频在线播放| 天天射天天干天天| 亚洲电影成人| 欧美成人免费全部| 国产又粗又猛又爽又黄av| 精品资源在线| 日韩一区二区三区电影在线观看 | 国产尤物99| 91久久久久久久久久久久| 香蕉国产精品偷在线观看不卡| 久久亚洲成人精品| 日韩黄色中文字幕| 美日韩中文字幕| 精品va天堂亚洲国产| 黄色小视频免费网站| 88xx成人永久免费观看| 欧美午夜丰满在线18影院| 少妇久久久久久被弄到高潮| 日本在线天堂| 中文av一区二区| 欧美日韩在线观看一区| 午夜视频免费看| 成人精品gif动图一区| 亚洲一区二区久久久久久| 中文在线字幕av| 日韩电影一二三区| 日韩美女av在线免费观看| 国产成人无码一区二区三区在线 | 久久91超碰青草是什么| 美女三级黄色片| 日韩精品一区二区三区免费观看| 亚洲色图35p| 好吊视频在线观看| 蜜桃一区二区| 亚洲一区999| 免费看91的网站| 日韩久久电影| 日韩中文综合网| 日韩在线不卡av| 7777久久香蕉成人影院| 免费不卡欧美自拍视频| 欧美日韩偷拍视频| 狠狠爱成人网| 国产91精品高潮白浆喷水| 日韩手机在线观看| 午夜在线一区二区| 国产精品美腿一区在线看| 又骚又黄的视频| 国产在线一区观看| www.成人av| 天天操天天爱天天干| 久久综合久久久久88| 欧美中日韩免费视频| lutube成人福利在线观看| 国产精品视频你懂的| 伊人婷婷久久| 久草在线视频网站| 大桥未久av一区二区三区| 能在线观看的av| 欧美黄色a视频| 日韩丝袜情趣美女图片| 污污污www精品国产网站| 亚洲精华一区二区三区| 亚洲一级一级97网| 人妻少妇精品一区二区三区| 亚洲三级国产| 国产精品久久久av久久久| 国产精品一区二区av白丝下载| 福利一区在线观看| 免费电影一区| 好了av在线| 欧美性xxxxxxx| 小早川怜子一区二区三区| 大奶在线精品| 伊人久久久久久久久久久久久 | 久久网站免费观看| 久久99国产综合精品女同| 日韩精品1区2区| 久久99国产精品久久99果冻传媒| 国产一区二区三区在线观看免费视频| 亚洲精品国产精品国产自| 亚洲图片另类小说| 亚洲国产精品久久久天堂| 97av在线影院| 国产免费黄色片| wwww国产精品欧美| 日韩最新中文字幕| 在线观看欧美日韩电影| 日韩一级成人av| 亚洲精品视频久久久| 午夜日韩福利| 国产精品久久久久91| 欧美一级做性受免费大片免费| 国产欧美一区二区精品性色超碰 | 国产伦精品一区二区三区免 | 亚洲欧美另类久久久精品| 丝袜老师办公室里做好紧好爽| 亚洲成人毛片| 亚洲欧洲日本专区| 日本少妇xxxx动漫| 国精品**一区二区三区在线蜜桃| 久久精品日韩| aa级大片免费在线观看| 99热这里只有精品首页| 欧美午夜宅男影院在线观看| 特黄特黄一级片| 欧美一二区在线观看| 3344国产精品免费看| 亚洲第一成年人网站| 中文字幕亚洲在| 丰满少妇在线观看| 亚洲国产合集| 91高清在线免费观看| 亚洲第一成年人网站| 亚洲欧美乱综合| 国内国产精品天干天干| 成人激情诱惑| 国产欧美综合色| 欧美mv日韩mv国产网站app| 人妻丰满熟妇aⅴ无码| 欧美成熟视频| 91久久精品国产91久久| 福利在线午夜| 一本色道a无线码一区v| 无码av免费精品一区二区三区| 我不卡伦不卡影院| 国产精品入口夜色视频大尺度| 毛片免费在线| 欧美日韩视频在线| yy1111111| 日韩视频一区二区三区在线播放免费观看| 91九色视频在线| 黄av在线播放| 日韩欧美一二三四区| 欧美第一页在线观看| 韩国成人精品a∨在线观看| 亚洲最大色综合成人av| 福利视频亚洲| 久久亚洲国产精品| www.五月婷| 亚洲国产欧美一区二区三区丁香婷| 国产又粗又猛大又黄又爽| 伊人青青综合网| 成人看片在线| 超级白嫩亚洲国产第一| 欧美天堂亚洲电影院在线观看| 欧洲一区二区av| 免费看裸体网站| 蜜臀a∨国产成人精品| 亚洲永久激情精品| 亚洲精品第一| 欧美激情视频一区二区| 黄色片一区二区| 欧美视频一区二区三区…| av中文字幕免费观看| 男女性色大片免费观看一区二区| 中国成人在线视频| 香蕉大人久久国产成人av| 国模吧一区二区三区| 清纯唯美亚洲色图| 欧美三级资源在线| 天堂网avav| 99热在这里有精品免费| 成人黄色片视频| 999久久久国产精品| 91九色对白| av日韩电影| 久久精品人人爽| 三级网站在线看| 在线观看www91| 欧美日韩免费一区二区| 97精品久久久午夜一区二区三区| 精品久久久久久久无码| 亚洲色图88| 久久伊人资源站| 日韩三区四区| 国产91ⅴ在线精品免费观看| 天天在线视频色| 亚洲第一网站男人都懂| 亚洲免费视频二区| 亚洲一区二区成人在线观看| 日韩精品无码一区二区三区久久久 | 国产理论在线| 日韩中文字在线| 三级理论午夜在线观看| 制服丝袜在线91| 天堂网中文字幕| 亚洲一区在线观看免费观看电影高清| 丰满圆润老女人hd| 丰满岳乱妇一区二区三区| 男女爽爽爽视频| 亚洲国产精品一区| 咪咪色在线视频| 奇米色欧美一区二区三区| 91久久偷偷做嫩草影院| 久草综合在线| 欧洲成人在线观看| 伊人影院在线视频| 中文字幕欧美亚洲| 天堂影院在线| 精品捆绑美女sm三区| 国产一级片免费视频| 亚洲a一区二区| 国产免费无码一区二区视频 | 国产午夜手机精彩视频| 国产欧美一区二区三区鸳鸯浴 | 日韩av免费一区| 欧洲中文在线| 久久天天躁狠狠躁夜夜躁| 免费在线超碰| 亚洲国产成人一区| 精品人妻一区二区三区日产乱码| 欧洲色大大久久| 日韩精品在线观看免费| 亚洲狠狠爱一区二区三区| 国产第一页浮力| 国产精品三级视频| 亚洲精品午夜视频| 91丨porny丨最新| 亚洲精品乱码久久久久久蜜桃图片| 国产一区二区三区免费观看| 亚洲综合欧美在线| 噜噜噜躁狠狠躁狠狠精品视频| 国产免费黄色小视频| 黑丝一区二区三区| 国产一级大片免费看| 欧美二区视频| 在线观看av的网址| 一区二区三区午夜视频| 在线观看成人av电影| 欧美gayvideo| 中文字幕欧美日韩一区二区| 99久久综合| 最新中文字幕久久| 91精品电影| 精品嫩模一区二区三区| 欧美福利影院| 97超碰人人澡| 性8sex亚洲区入口| 国产一区二区视频免费在线观看| 久久高清一区| 热久久精品免费视频| 蜜臀av国产精品久久久久| 亚洲欧美日韩精品一区| 狠狠网亚洲精品| 无套白嫩进入乌克兰美女| 国产成人在线电影| www.男人天堂| 国产欧美一区二区精品性色| 欧美成人短视频| 亚洲欧美电影院| 国产无遮无挡120秒| 狠狠久久亚洲欧美专区| 亚洲va在线观看| 欧美撒尿777hd撒尿| 国产偷拍一区二区| 亚洲高清久久网| 粉嫩av一区| 久久成人这里只有精品| gogo久久| 国产成人中文字幕| 91麻豆精品国产91久久久更新资源速度超快| 91久久精品在线| 超碰97久久国产精品牛牛| 精品欧美一区二区三区久久久| 九九在线精品| 亚洲成人动漫在线| 亚洲黄色精品| jizz18女人| 成人自拍视频在线| 男人天堂av电影| 亚洲欧美日韩电影| 福利网址在线观看| 欧美精品第一页| 特级丰满少妇一级aaaa爱毛片| 亚洲天堂第二页| 牛牛精品视频在线| 琪琪亚洲精品午夜在线| 精品一区91| 日本视频一区在线观看| 亚洲视频电影在线| 日本黄色三级大片| 国产精品影音先锋| 午夜时刻免费入口| 亚洲国产视频在线| 中文字幕在线观看1| 亚洲国产精品99久久| 午夜精品一区| 日本道色综合久久影院| 国产一区二区视频在线看| 美国av一区二区三区 | 欧美牲交a欧美牲交| 亚洲91网站| 色久优优欧美色久优优| 国产精品日韩无码| 亚洲网站在线观看| 国产精品69xx| 91免费在线视频网站| 亚洲国产合集| 成年人看的毛片| 国精产品一区一区三区mba视频| 久久精品国产亚洲av麻豆| 一个色妞综合视频在线观看| 亚洲一级视频在线观看| 亚洲欧美中文日韩v在线观看| 91美女精品| 97在线资源站| 一区二区三区午夜探花| 九九九九九国产| 91麻豆精品视频| 国产在线成人精品午夜| 欧美一级在线免费| 99re热久久这里只有精品34| 国产www精品| 亚洲黄页在线观看| 精品国产免费av| 成人免费视频视频在线观看免费| 成熟的女同志hd| 91精品免费在线| 黄av在线免费观看| 成人性生交大片免费看小说| 成人精品影视| 欧美三级理论片| 中文av一区特黄| 在线免费看91| 日韩视频免费大全中文字幕| 国产精品4hu.www| 一区二区免费在线视频| 久久99久久久久| a一级免费视频| 91精品在线一区二区| 久cao在线| 亚洲最大av在线| 欧美a级在线| 少妇伦子伦精品无吗| 亚洲五码中文字幕| 国产成人三级在线观看视频| 久久琪琪电影院| 精品国产影院| 欧美 国产 综合| 久久众筹精品私拍模特| 日韩一区二区视频在线| 亚洲女成人图区| 国产精品麻豆成人av电影艾秋| 亚洲国内在线| 国产一区二区在线视频| 久久精品www人人爽人人| 亚洲国产精久久久久久久| 中文字幕人成乱码在线观看| 日韩aⅴ视频一区二区三区| 蜜臀久久久久久久| 日韩一区二区不卡视频| 日韩午夜在线观看视频| 久草在线中文最新视频| 欧美深深色噜噜狠狠yyy| 久久精品理论片| 福利所第一导航| 亚洲激情中文字幕| 先锋欧美三级| 51xx午夜影福利| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 黑色丝袜福利片av久久| 国产中文字幕免费观看| 国产欧美精品一区aⅴ影院| 国产女人高潮时对白| 777精品视频| 三区四区不卡| 制服丝袜av在线| 欧美日韩五月天| 日本高清在线观看| 欧美成人dvd在线视频| 久久国产三级精品| 日本va欧美va国产激情| 在线亚洲国产精品网| 一区二区三区国产好| 看欧美ab黄色大片视频免费| 亚洲男女一区二区三区| 精品久久久久一区二区三区 | 天堂资源在线亚洲| 中国黄色片一级| 欧美日韩中文字幕在线|