檔案分割器 (轉)
檔案分割器 (轉)[@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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 中轉檔案
- PDF檔案轉換為DWF檔案
- PCL——txt檔案轉到PCD檔案
- WOR檔案轉換成GST檔案
- 將Schema檔案轉換為Java檔案Java
- ASM 檔案與本地檔案的轉換ASM
- 本地檔案轉 Drawable
- 轉儲 控制檔案
- ISO檔案解析(轉)
- 檔案關聯 (轉)
- java寫檔案(轉)Java
- Photoshop檔案格式(轉)
- RedHat 日檔案(轉)Redhat
- Json檔案轉換為Excel檔案!涉及讀檔案,時間戳轉化,寫文件JSONExcel時間戳
- 如何將.ipynb檔案轉換為.py檔案
- Oracle 跟蹤檔案和檔案轉儲(dump)Oracle
- perl檔案上傳程式,支援多檔案! (轉)
- Windows轉到linux中,檔案亂碼,檔案編碼轉換WindowsLinux
- Linux下把sra檔案轉成fastq檔案LinuxAST
- Mxnet模型檔案轉換為Pb模型檔案模型
- Word檔案如何轉為PDF檔案,小技能分享!
- 檢測檔案編碼,轉換檔案編碼
- 標頭檔案與庫檔案與菜鳥 (轉)
- python 將 CVS檔案轉為HTML檔案PythonHTML
- 忽略特殊檔案(轉載)
- PDF檔案轉HTML方法HTML
- 【轉】Go檔案操作大全Go
- Oracle:dump轉儲檔案Oracle
- Oracle 引數檔案(轉)Oracle
- tkprof 轉換trc檔案
- 快速建立檔案列表(轉)
- 快速查詢檔案(轉)
- 控制檔案詳解(轉)
- XML口令檔案描述 (轉)XML
- 檔案管理系統 (轉)
- BMP檔案結構 (轉)
- MIDI 檔案格式 (轉)
- 再議JAR檔案(轉)JAR