目錄的打包和解包

2021-04-08 13:16:20 字數 2889 閱讀 3537

由於程式中需要把整個目錄打包,所以自己寫了打包和解包函式,我對此打包檔案的布局設計如下: 

20位元組:表明目錄結構的起點

……

目錄結構起點(前

20個位元組標明的):

檔案內容起點:

檔案fd結構

檔案fd結構

檔案內容

檔案內容

目錄fd結構

目錄fd結構

目錄fd結構

……

20位元組:表明目錄結構的起點

……

目錄結構起點(前20個位元組標明的):

檔案內容起點:

檔案fd結構

檔案fd結構

檔案內容

檔案內容

目錄fd結構

目錄fd結構

目錄fd結構

……

上述的fd結構其實就是:

typedef struct stfd

fd;

打包函式:

void packdir(lpctstr lpszdir, lpctstr lpszoutputfile)

// 建立打包檔案

cfile packfile;

if(!packfile.open(lpszoutputfile, cfile::modecreate|cfile::modereadwrite, null))

// 先把檔案開始的noffset個位元組佔住,用於表示到目錄結構所要偏移的位元組數            

packfile.seektobegin();

packfile.write(szcnt, noffset); 

strlst.addtail(lpszdir);

while(!strlst.isempty())

// 找到檔案

packfile.seektoend();

// 將檔案結構寫進

packfile.write(&fdtmp, sizeof(fd));

// 將檔案內容寫進

pszfilecontent = new tchar[finder.getlength()];

if(!filetmp.open(finder.getfilepath(), cfile::moderead, null))

filetmp.read(pszfilecontent, finder.getlength());

packfile.write(pszfilecontent, finder.getlength());

delete pszfilecontent;}}

strlst.removehead();

}// 在開始的noffset個位元組處寫進目錄結構偏移量

dword dwcnt = packfile.seektoend();

sprintf(szcnt, "%ld", dwcnt);

packfile.seektobegin();

packfile.write(szcnt, noffset);

// 去到最後寫進目錄結構

packfile.seektoend();

for(int i = 0; i < vdirfd.size(); i++)

packfile.close();

}解包函式:

void unpackdir(lpctstr lpszinputfile, lpctstr lpszdir)

// 先建立目錄結構

memset(szcnt, 0, noffset);

fileinput.read(szcnt, noffset);

noff = atoi(szcnt);

// 去到檔案目錄結構的起點

fileinput.seek( noff, cfile::begin );

while(!isfileend(fileinput))

// 再把檔案建立好

dwcurpos = fileinput.seek(noffset, cfile::begin);

cfile filetmp;

while(dwcurpos < noff)

// 把內容複製過去

pszfilecontent = new tchar[fdtmp.nsize];

fileinput.read(pszfilecontent, fdtmp.nsize);

filetmp.seektobegin();

filetmp.write(pszfilecontent, fdtmp.nsize);

delete pszfilecontent;

// 把檔案的屬性改變,先關閉再改

filetmp.close();

cfilestatus rstatus;

ctime ctime(fdtmp.ctime);

ctime atime(fdtmp.atime);

ctime mtime(fdtmp.mtime);

rstatus.m_atime = atime;

rstatus.m_ctime = ctime;

rstatus.m_mtime = mtime;

rstatus.m_attribute = (byte)fdtmp.attribute;

rstatus.m_size = fdtmp.nsize;

lstrcpy(rstatus.m_szfullname, strfile);

cfile::setstatus(strfile, rstatus);

dwcurpos = fileinput.getposition();  

}fileinput.close();

}還有乙個判斷是否到了檔案末尾的函式:

bool isfileend(cfile &file)

return true;

}

tar打包和解包

tar這個命令用了上百次,每次用之前都需要再確認一遍。雖然是很簡單的命令,但是對於乙個每天要想很多事情的老年人來說,要精準記住每個引數還真不是件容易的事,索性寫下來,下次開啟博文照做就好了,呵呵 打包 tar zcvf file.tar.gz file1 file2 file2 tar jcvf f...

python中 和 的打包和解包

python中的 和 能夠讓函式支援任意數量的引數,它們在函式定義和呼叫中,有著不同的目的 一.打包引數 的作用 在函式定義中,收集所有的位置引數到乙個新的元組,並將這個元組賦值給變數args def f args print args f f 1 1,f 1,2,3,4 1,2,3,4 的作用 在...

打包和解包彙總 gz bz2 xz zip

gz tar xvzf abc.tar.gz gz壓縮的解包 打包 tar cvzf abc.tar.gz abc.txt bz2 tar xvjf abc.tar.bz2 bz2格式的解包 打包 tar cvjf abc.tar.bz2 abc.txt xz 先xz d abc.tar.xz 然後...