檔案分割器 (轉)
檔案分割器 (轉)[@more@]分割器
李光強
檔案分割器是個比較實用的工具。當我們要從別的複製一個大於一張容量的檔案或圖片時就可以體會到它的好處。檔案分割器的原理其實很簡單,大體是這樣:先把想要分割的檔案的大小讀出來,再用它去除每張磁碟的容量,得出所需的磁碟數,然後就開始讀取檔案內容,同時建立一個新檔案,把讀出來的內容存入新檔案中,等到新檔案的大小等於一張磁碟的容量時就暫停,然後又建立另一個新的檔案,繼續讀取原始檔的內容,把這些內容存入剛建立的檔案中,如此迴圈直到分割結束。當然分割後的檔案要重新合併才可以使用,所以合併也是必不可少的。合併過程是這樣的:把分割的檔案依次讀出來,並用追加方式寫入你所指定的檔案中。
下面是具體的實現過程:
#include 〈iostream.h〉
#include 〈fstream.h〉
#include 〈stdlib.h〉
int main(int argc,char * argv[])
{void setfilename(char * dest,char * src,int i);
char filename[100];
if(argc==1)
{cerr〈〈″命令不對″〈〈endl;
exit(1);}
if(argc==2)
//以下為分割檔案程式碼
{int count=1,disksize=2048*705,disknum;
fstream f2(argv[1],ios::in¦ios::binary¦ios::nocreate); //開啟要分割的檔案
if(f2.fail()) exit(1); //開啟失敗則退出
f2.seekg(0,ios::end);
streamppos2=f2.tellp();
f2.seekg(0,ios::beg);
disknum=pos2/disksize;
if(!disknum) exit(0);
//如果檔案小於一張磁碟容量則退出
if(pos2%disksize) disknum=disknum+1;
for(int b=1;b〈disknum+1;b++)
{int y;
setfilename(filename,argv[1],b);
//建立檔名
fstream f1(filename,ios::out¦ios::binary);
//建立新檔案
do{y=f2.get();
//從要分割的檔案讀取資料
count=count+1;
f1.write((char *)&y,sizeof(char));}
//往新檔案寫資料
while((y!=EOF)&&(count〈=disksize*b));
f1.close(); }
f2.close();}
else //以下為檔案合併程式碼
{int x;
fstream f(argv[1],ios::out¦ios::app¦ios::binary);
for(int i=2;i〈argc;i++)
{fstream f1(argv[i],ios::in¦ios::binary¦ios::nocreate);
if(f1.fail()) exit(1);
x=f1.get();
while(x!=EOF)
{f.write((char *)&x,sizeof(char));
x=f1.get();}
f1.close();}
f.close();}}
//以下為建立檔名函式
void setfilename(char*dest,char *src,int i)
{int x,a=0,b=0;
bool flag=false;
for(int i=0;src[i]!=′′;i++)
if (src[i]==′.′) flag=true;
//判斷檔案是否含有副檔名
if(flag)//如有副檔名則按以下程式碼處理
{while(src[b]!=′.′)
{dest[b]=src[b];
b++;}
a=b;
if(i〈=9)
{x=i+48;
dest[a]=(char) x;}
for(int i=0;i〈4;i++)
{if(src[b]!=′′)
{a=a+1;
dest[a]=src[b];
b=b+1;}
else break;}
dest[a+1]=′′;}
else{//如沒有副檔名則按下面程式碼處理
while(src[a]!=′′)
{dest[a]=src[a];
a=a+1;}
if(i〈=9)
{x=i+48;
dest[a]=char (x);
dest[a+1]=′′;}}}
以上在簡體中文 98 SE版下用Borland C++ 5.0透過。由於篇幅的原因,本程式省了很多東西,比如最大隻能分割成9個檔案及很多的出錯處理程式碼。我只希望本文能起到拋磚引玉的作用,讓諸位高手編出更好的程式。此程式只可在命令視窗下使用,分割檔案時,輸入程式名和要分割的檔名;合併檔案時,輸入程式名和要合併的目標檔名及需要合併的原始檔名。
李光強
檔案分割器是個比較實用的工具。當我們要從別的複製一個大於一張容量的檔案或圖片時就可以體會到它的好處。檔案分割器的原理其實很簡單,大體是這樣:先把想要分割的檔案的大小讀出來,再用它去除每張磁碟的容量,得出所需的磁碟數,然後就開始讀取檔案內容,同時建立一個新檔案,把讀出來的內容存入新檔案中,等到新檔案的大小等於一張磁碟的容量時就暫停,然後又建立另一個新的檔案,繼續讀取原始檔的內容,把這些內容存入剛建立的檔案中,如此迴圈直到分割結束。當然分割後的檔案要重新合併才可以使用,所以合併也是必不可少的。合併過程是這樣的:把分割的檔案依次讀出來,並用追加方式寫入你所指定的檔案中。
下面是具體的實現過程:
#include 〈iostream.h〉
#include 〈fstream.h〉
#include 〈stdlib.h〉
int main(int argc,char * argv[])
{void setfilename(char * dest,char * src,int i);
char filename[100];
if(argc==1)
{cerr〈〈″命令不對″〈〈endl;
exit(1);}
if(argc==2)
//以下為分割檔案程式碼
{int count=1,disksize=2048*705,disknum;
fstream f2(argv[1],ios::in¦ios::binary¦ios::nocreate); //開啟要分割的檔案
if(f2.fail()) exit(1); //開啟失敗則退出
f2.seekg(0,ios::end);
streamppos2=f2.tellp();
f2.seekg(0,ios::beg);
disknum=pos2/disksize;
if(!disknum) exit(0);
//如果檔案小於一張磁碟容量則退出
if(pos2%disksize) disknum=disknum+1;
for(int b=1;b〈disknum+1;b++)
{int y;
setfilename(filename,argv[1],b);
//建立檔名
fstream f1(filename,ios::out¦ios::binary);
//建立新檔案
do{y=f2.get();
//從要分割的檔案讀取資料
count=count+1;
f1.write((char *)&y,sizeof(char));}
//往新檔案寫資料
while((y!=EOF)&&(count〈=disksize*b));
f1.close(); }
f2.close();}
else //以下為檔案合併程式碼
{int x;
fstream f(argv[1],ios::out¦ios::app¦ios::binary);
for(int i=2;i〈argc;i++)
{fstream f1(argv[i],ios::in¦ios::binary¦ios::nocreate);
if(f1.fail()) exit(1);
x=f1.get();
while(x!=EOF)
{f.write((char *)&x,sizeof(char));
x=f1.get();}
f1.close();}
f.close();}}
//以下為建立檔名函式
void setfilename(char*dest,char *src,int i)
{int x,a=0,b=0;
bool flag=false;
for(int i=0;src[i]!=′′;i++)
if (src[i]==′.′) flag=true;
//判斷檔案是否含有副檔名
if(flag)//如有副檔名則按以下程式碼處理
{while(src[b]!=′.′)
{dest[b]=src[b];
b++;}
a=b;
if(i〈=9)
{x=i+48;
dest[a]=(char) x;}
for(int i=0;i〈4;i++)
{if(src[b]!=′′)
{a=a+1;
dest[a]=src[b];
b=b+1;}
else break;}
dest[a+1]=′′;}
else{//如沒有副檔名則按下面程式碼處理
while(src[a]!=′′)
{dest[a]=src[a];
a=a+1;}
if(i〈=9)
{x=i+48;
dest[a]=char (x);
dest[a+1]=′′;}}}
以上在簡體中文 98 SE版下用Borland C++ 5.0透過。由於篇幅的原因,本程式省了很多東西,比如最大隻能分割成9個檔案及很多的出錯處理程式碼。我只希望本文能起到拋磚引玉的作用,讓諸位高手編出更好的程式。此程式只可在命令視窗下使用,分割檔案時,輸入程式名和要分割的檔名;合併檔案時,輸入程式名和要合併的目標檔名及需要合併的原始檔名。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987242/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 3.3 分割器
- GBFF檔案轉GFF檔案
- PDF檔案轉換為DWF檔案
- python 將 CVS檔案轉為HTML檔案PythonHTML
- 把 .xyz 檔案轉換成 .ply 檔案
- Json檔案轉換為Excel檔案!涉及讀檔案,時間戳轉化,寫文件JSONExcel時間戳
- 本地檔案轉 Drawable
- 如何將BigWig 檔案轉化為 bed 檔案
- Linux下把sra檔案轉成fastq檔案LinuxAST
- 如何將.ipynb檔案轉換為.py檔案
- Mxnet模型檔案轉換為Pb模型檔案模型
- md檔案批次轉htmlHTML
- 忽略特殊檔案(轉載)
- PDF檔案轉HTML方法HTML
- 檢測檔案編碼,轉換檔案編碼
- Word檔案如何轉為PDF檔案,小技能分享!
- aspose word轉換pdf檔案後將pdf檔案轉換為圖片png
- 如何使用python把json檔案轉換為csv檔案PythonJSON
- plist檔案格式轉換器
- .ui轉.py檔案報錯UI
- heic檔案如何轉換jpg?
- caj檔案怎麼轉換成word文件,簡單的檔案格式轉換教程
- 將ASD光譜儀的.asd檔案轉為文字檔案
- PDF檔案如何轉換為能編輯的CAD檔案
- chm檔案怎麼轉換成TXT格式?chm檔案快速轉化成TXT格式的方法
- 推薦一個yaml檔案轉json檔案的線上工具YAMLJSON
- Torrent檔案的解析與轉換
- 轉換Linux 檔案編碼方式Linux
- java 字串與檔案相互轉換Java字串
- Linux與Windows共享檔案Samba(轉)LinuxWindowsSamba
- ini檔案解析c庫(iniparser)【轉】
- PDF檔案如何轉成markdown格式
- 日誌檔案使用小結(轉)
- RTF 批量轉換為 DOCX 檔案
- 使用 Fstransform 轉換檔案系統ORM
- caj轉pdf檔案怎麼操作?
- ofd檔案如何轉換成pdf格式 電腦上ofd檔案如何轉換成pdf格式
- Laravel 專案中 PCM 音波檔案轉 WAV 音訊檔案案例【經驗分享】Laravel音訊
- word檔案怎樣取消只讀模式 把只讀檔案轉化為可編輯檔案模式