SelfExtractor理解文檔
九天雁翎:blog.jtianling.cn
ReadToc(CString Filename)
首先從檔案尾反向Seek一個strlen(檔案標誌)的距離,然後讀取檔案標誌,判斷此檔案標誌.錯誤即返回INVALID_SIG.
然後再從檔案尾反向Seek一個strlen(檔案標誌)+sizeof(int)的距離,讀取一個整數,此整數代表檔案數量.當其為0,即返回NOTHING_TO_DO,
然後根據檔案數量,迴圈依次反向的Seek,讀取檔案名稱長度,檔案名稱,檔案長度,檔案在文檔中的位移值.將各檔案的資訊儲存在m_InfoArray數組中,將最後得到的位移值,儲存在m_nTOCSize中,此位移值即整個文檔頭的大小.
int CSelfExtractor::ExtractOne(CFile* file, int index, CString Dir);
通過m_InfoArray中的資料,讀入,並寫入建立的新檔案;寫入時一次寫1000位元組,沒有1000位元組即寫入剩下大小.
int CSelfExtractor::ExtractAll(CString Dir, funcPtr pFn /*= NULL*/, void * userData /*= NULL*/)
首先讀取文檔頭,得到儲存有檔案資訊的m_InfoArray數組,然後依據此數組,分別調用ExtractOne解壓到磁碟上,解壓後還可以調用funcPtr類型的使用者定義函數.
int CSelfExtractor::CreateArchive(CFile* pFile, funcPtr pFn, void* userData)
先分別從m_InfoArray數組中讀入檔案的資訊,並從外部讀入,寫入到文檔中,
然後寫文檔頭
int CSelfExtractor::Create(UINT resource, CString Filename, funcPtr pFn /* = NULL */, void* userData /*=NULL*/)
分別用FindResource,LoadResource,LockResource函數讀入執行檔案資源.
將整個執行檔案全部寫入新建立的檔案.調用CreateArchive完成接下來的檔案的寫入.
int CSelfExtractor::Create(CString ExtractorPath, CString Filename, funcPtr pFn /* = NULL */, void* userData /*=NULL*/)
不是以資源形式給出可執行檔時:
先利用
CShellFileOp shOp;
shOp.SetFlags(FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_SILENT);
shOp.AddFile(SH_SRC_FILE, ExtractorPath);
shOp.AddFile(SH_DEST_FILE, Filename);
if(shOp.CopyFiles() != 0)
return COPY_FAILED;
來完成從一個使用者指定可執行檔到建立立文檔的複製,接著還是利用調用CreateArchive完成接下來的檔案的寫入.