作者:Future Studio.徐景周
版權所有:徐景周
轉載請聯系作者
你也許會遇到到這樣一個問題?當你有一個較大的軟件,而無法用一張軟盤將其全部拷下時,你也許會想到該將它分解開,分盤拷回去後,再將它們合並起來。現在的這種分割工具很多,你想自己動手做一個適合自己的分割工具麼?下面就讓我用以前用VC做的一個<袖珍文件分割器>的例程來告訴你吧!程序運行後界面如下:
圖一
基本構成思想:文件分割的基本思想比我之前發表的另一篇文章《如何將多個文件合並為一個可執行程序》的構成思想簡單多了,它主要也分為分割文件和合並分割後的文件二大部分。分割文件,將原文件按指定分割大小進行等分,然後順序讀取其指定分割大小數據後到寫到各自的新建文件中。合並文件,將各分割後的文件順序讀取後,寫入到一個文件中既可。分割文件時,打開文件,讀取指定的分割大小一段數據,寫入到一新建文件中,接著再讀同樣大小的一段數據,再寫入到一新建文件中……,直到讀出文件最後一部分數據,寫入到最後一個新建文件中。對每一個分割後的新建文件名,采用原文件名前加數字信息的方法,按分割的順序,按個加上一數字標識信息,以便合並時使用。
分割文件的部分代碼實現如下:
//文件分割涵數
int CFileSpltDlg::SplitMe()
{
......
//分割文件
do {
//動態建立一個新建文件名的前的數字
name = _ltoa(l, buff, 10);
name += _T("_");
CString newpath;
//判斷選擇目錄未尾是否已有"\"符
if(m_targetpath.Right(1)=='\\')
newpath = m_targetpath;
else
newpath = m_targetpath + _T("\\");
if (!destFile.Open(newpath + name + m_SourceFile.GetFileName(),
CFile::modeWrite |
CFile::shareExclusive |
CFile::typeBinary |
CFile::modeCreate, &ex)) {
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
::AfxMessageBox(szError);
m_SourceFile.Close();
return 1;
}
do {
dwRead = m_SourceFile.Read(buffer, nCount);
destFile.Write(buffer, dwRead);
}//當文件小於指定要分割的大小時
while (dwRead > 0 && destFile.GetLength() < newlen);
destFile.Close();
l++;
UpdateWindow();
}while (dwRead > 0);
m_SourceFile.Close();
return 0;
}
合並文件時:和上面分割所采用的方法相反,將各個分割後的小文件讀出後,按其分割後文件名前數字大小的順序,按個寫入到新建的文件中,這一新建文件的名字,為去掉分割後文件前面數字部分後的文件名(既原文件名)。
合並文件的部分代碼實現如下:
// 文件合並函數
int CFileSpltDlg::MergeMe()
{
......
//開始合並文件
do {
//自動定位分割文件名前的數字信息
pref = _ltoa(l, buff, 10);
pref += _T("_");
//打開新的分割文件
if (!m_SourceFile.Open(newpath + pref + m_filename,
CFile::modeRead |
CFile::shareExclusive |
CFile::typeBinary, &ex)) {
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
destFile.Close();
m_path = _T("");
m_filename = _T("");
newpath = _T("");
UpdateData(FALSE);
return 0;
}
else
//形成一個新的文件名
name = _T(newpath + pref + m_filename);
do {//寫入到目標文件中
dwRead = m_SourceFile.Read(buffer, nCount);
destFile.Write(buffer, dwRead);
}while (dwRead > 0);
m_SourceFile.Close();
l++;
UpdateWindow();
}while (l < 500);//little bit dirty solution, but you can always
improve it!...
return 0;
}