檔案分割器 (轉)

worldblog發表於2007-12-02
檔案分割器 (轉)[@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個檔案及很多的出錯處理程式碼。我只希望本文能起到拋磚引玉的作用,讓諸位高手編出更好的程式。此程式只可在命令視窗下使用,分割檔案時,輸入程式名和要分割的檔名;合併檔案時,輸入程式名和要合併的目標檔名及需要合併的原始檔名。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987242/,如需轉載,請註明出處,否則將追究法律責任。

相關文章