如何把多个文件写入到一个文件中去并能分解.docx

上传人:b****2 文档编号:3578392 上传时间:2023-05-06 格式:DOCX 页数:16 大小:17.21KB
下载 相关 举报
如何把多个文件写入到一个文件中去并能分解.docx_第1页
第1页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第2页
第2页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第3页
第3页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第4页
第4页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第5页
第5页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第6页
第6页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第7页
第7页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第8页
第8页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第9页
第9页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第10页
第10页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第11页
第11页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第12页
第12页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第13页
第13页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第14页
第14页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第15页
第15页 / 共16页
如何把多个文件写入到一个文件中去并能分解.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

如何把多个文件写入到一个文件中去并能分解.docx

《如何把多个文件写入到一个文件中去并能分解.docx》由会员分享,可在线阅读,更多相关《如何把多个文件写入到一个文件中去并能分解.docx(16页珍藏版)》请在冰点文库上搜索。

如何把多个文件写入到一个文件中去并能分解.docx

如何把多个文件写入到一个文件中去并能分解

如何把多个文件写入到一个文件中去并能分解.txt如果你同时爱几个人,说明你年轻;如果你只爱一个人,那么,你已经老了;如果你谁也不爱,你已获得重生。

积极的人一定有一个坚持的习惯。

对于一个文件的读写,其实很简单,就是用FileStream进行Read或者Write就行了。

但是如何把多个文件写入到同一个文件,之后要能把这个文件进行还原成多个文件。

那么光靠FileStream的Read和Write方法是不够的,首先你需要自行建立文件索引,来标明每个文件在当前文件的位置。

那么最近作了一个简单的DEMO,其中类的部分代码如下:

//-------------------------------ComposeFiles----------------------------------

//--------------------------------------------------------------------------------

//---File:

clsComposeFiles.cs

//---Description:

Thisfileistoshowhow-tocomposemulti-filesintoonefile

//anddecomposeonefiletomulti-files.

//---Author:

Knight

//---Date:

May.16,2006

//--------------------------------------------------------------------------------

//------------------------------{ComposeFiles}---------------------------------

namespaceComposeFiles

{

usingSystem;

usingSystem.IO;

usingSystem.Collections;

usingSystem.Text;

///

///SummarydescriptionforclsComposeFiles.

///

publicclassclsComposeFiles

{

privateArrayListarrFiles=newArrayList();

publicclsComposeFiles()

{

//

//TODO:

Addconstructorlogichere

//

}

///

///Addafiletobecomposed

///

///

publicvoidAddFile(stringsFileName)

{

arrFiles.Add(sFileName);

}

///

///Composefilestothespecificfile

///

///

///

publicboolComposeFiles(stringsFileName)

{

if(arrFiles.Count==0)returnfalse;

FileInfofi=newFileInfo(sFileName);

//Openfiletowrite

FileStreamfsWriter=null;

try

{

if(!

fi.Exists)

{

fsWriter=newFileStream(

sFileName,

FileMode.CreateNew,

FileAccess.ReadWrite,

FileShare.None);

}

else

fsWriter=newFileStream(

sFileName,

FileMode.Truncate,

FileAccess.ReadWrite,

FileShare.None);

}

catch(Exceptionerr)

{

System.Diagnostics.Debug.WriteLine(err.Message);

returnfalse;

}

byte[]bBuffer=null;

//Writefilescount

bBuffer=FileIndex.LongToBytes(arrFiles.Count);

fsWriter.Write(bBuffer,0,8);

constlongINDEX_START_POS=8L;

//Initfilesindex

FileIndexFI=newFileIndex();

for(inti=0;i

fsWriter.Write(FileIndex.ConvertToBytes(refFI),0,32);

longFILE_START_POS=INDEX_START_POS+32*arrFiles.Count;

longlCurFileStartPos=FILE_START_POS;

//Writeeveryfile

for(inti=0;i

{

WriteFile(arrFiles[i].ToString(),

reflCurFileStartPos,

INDEX_START_POS,

fsWriter,

i);

}

//Closestream

fsWriter.Close();

returntrue;

}

///

///Writefilenameanddataintocomposedfile

///

///

///

///

///

///

privatevoidWriteFile(

stringsFileName,

reflongFileStartPos,

longIndexStartPos,

FileStreamfsWriter,

intIndex)

{

FileInfofi=newFileInfo(sFileName);

if(!

fi.Exists)return;

FileStreamfsReader=null;

try

{

fsReader=newFileStream(

sFileName,FileMode.Open,

FileAccess.Read);

}

catch{return;}

//Getfilename

byte[]bFileName=Encoding.Unicode.GetBytes(fi.Name);

//Writefilename

fsWriter.Write(bFileName,0,bFileName.Length);

constintBUFFER_LENGTH=1024;

byte[]bBuffer=newbyte[BUFFER_LENGTH];

intnRealRead=0;

//Writedatausing

do

{

//Readdatafromfile

nRealRead=fsReader.Read(bBuffer,0,

BUFFER_LENGTH);

//Writedata

fsWriter.Write(bBuffer,0,nRealRead);

}while(nRealRead>0);

//Closefilereader

fsReader.Close();

FileIndexFINew=newFileIndex();

FINew.NameStartPos=FileStartPos;

FINew.NameLength=bFileName.Length;

FINew.FileStartPos=FileStartPos+bFileName.Length;

FINew.FileLength=fi.Length;

//Gobacktofileindexposition

fsWriter.Seek(IndexStartPos+Index*32,SeekOrigin.Begin);

//Writefileindexinfo

fsWriter.Write(FileIndex.ConvertToBytes(refFINew),0,32);

//Gobacktofileend

fsWriter.Seek(0,SeekOrigin.End);

//Setfilecurrentposition

FileStartPos+=bFileName.Length+fi.Length;

}

///

///Decomposefiletomultifilesintospecificdirectory

///

///

///

///

publicboolDecomposeFile(stringsFileName,stringsDestDir)

{

FileInfofi=newFileInfo(sFileName);

if(!

fi.Exists)returnfalse;

FileStreamfsReader=null;

try

{

fsReader=newFileStream(

sFileName,FileMode.Open,

FileAccess.Read);

}

catch{returnfalse;}

//Readfilecount

byte[]bFileCount=newbyte[8];

intnRealRead=0;

nRealRead=fsReader.Read(bFileCount,0,8);

if(nRealRead!

=8)

{

fsReader.Close();

returnfalse;

}

longlFileCount=FileIndex.BytesToLong(bFileCount);

if(lFileCount>0)

{

//Initfileindexarray

FileIndex[]fiArray=newFileIndex[lFileCount];

byte[]bFileIndex=newbyte[32];

for(inti=0;i

{

fsReader.Read(bFileIndex,0,32);

fiArray[i]=FileIndex.ConvertToFileIndex(bFileIndex);

}

if(sDestDir[sDestDir.Length-1]!

='\\')

sDestDir+="\\";

//Saveeveryfileintocurrentdirectory

for(inti=0;i

{

SaveFile(fsReader,

reffiArray[i],

sDestDir);

}

}

//Closefilereader

fsReader.Close();

returntrue;

}

///

///Saveeveryfileintodirectory

///

///

///

///

privatevoidSaveFile(

FileStreamfsReader,

refFileIndexFI,

stringsDestDir)

{

//Readfilename

byte[]bFileName=newbyte[FI.NameLength];

intnRealRead=fsReader.Read(bFileName,0,bFileName.Length);

if(nRealRead!

=bFileName.Length)return;

stringsFileName=Encoding.Unicode.GetString(bFileName);

sFileName=sDestDir+sFileName;

FileInfofi=newFileInfo(sFileName);

//Openfiletowrite

FileStreamfsWriter=null;

try

{

if(!

fi.Exists)

{

fsWriter=newFileStream(

sFileName,

FileMode.CreateNew,

FileAccess.ReadWrite,

FileShare.None);

}

else

fsWriter=newFileStream(

sFileName,

FileMode.Truncate,

FileAccess.ReadWrite,

FileShare.None);

}

catch(Exceptionerr){

System.Diagnostics.Debug.WriteLine(err.Message);

return;

}

//Initbuffer

constintBUFFER_LENGTH=1024;

byte[]bBuffer=newbyte[BUFFER_LENGTH];

longlLeft=FI.FileLength;

//Copyfile

do

{

if(lLeft>BUFFER_LENGTH)

{

fsReader.Read(bBuffer,0,BUFFER_LENGTH);

fsWriter.Write(bBuffer,0,BUFFER_LENGTH);

lLeft-=BUFFER_LENGTH;

}

else

{

nRealRead=fsReader.Read(bBuffer,0,(int)lLeft);

fsWriter.Write(bBuffer,0,nRealRead);

lLeft-=nRealRead;

}

}

while(lLeft>0);

//closefilewriter

fsWriter.Close();

}

}

///

///Fileindexdatastructure

///

publicstructFileIndex

{

publiclongNameStartPos;

publiclongNameLength;

publiclongFileStartPos;

publiclongFileLength;

publicstaticbyte[]ConvertToBytes(refFileIndexFI)

{

byte[]bData=newbyte[32];

Array.Copy(LongToBytes(FI.NameStartPos),0,bData,0,8);

Array.Copy(LongToBytes(FI.NameLength),0,bData,8,8);

Array.Copy(LongToBytes(FI.FileStartPos),0,bData,16,8);

Array.Copy(LongToBytes(FI.FileLength),0,bData,24,8);

returnbData;

}

publicstaticbyte[]LongToBytes(longlValue)

{

byte[]bData=newbyte[8];

bData[0]=(byte)((lValue>>56)&0xFF);

bData[1]=(byte)((lValue>>48)&0xFF);

bData[2]=(byte)((lValue>>40)&0xFF);

bData[3]=(byte)((lValue>>32)&0xFF);

bData[4]=(byte)((lValue>>24)&0xFF);

bData[5]=(byte)((lValue>>16)&0xFF);

bData[6]=(byte)((lValue>>8)&0xFF);

bData[7]=(byte)(lValue&0xFF);

returnbData;

}

publicstaticFileIndexConvertToFileIndex(byte[]bData)

{

if(bData==null||bData.Length!

=32)

thrownewException("Invalidparameters!

");

FileIndexFI=newFileIndex();

byte[]bBuffer=newbyte[8];

Array.Copy(bData,0,bBuffer,0,8);

FI.NameStartPos=BytesToLong(bBuffer);

Array.Copy(bData,8,bBuffer,0,8);

FI.NameLength=BytesToLong(bBuffer);

Array.Copy(bData,16,bBuffer,0,8);

FI.FileStartPos=BytesToLong(bBuffer);

Array.Copy(bData,24,bBuffer,0,8);

FI.FileLength=BytesToLong(bBuffer);

returnFI;

}

publicstaticlongBytesToLong(byte[]bData)

{

if(bData==null||bData.Length!

=8)

thrownewException("Invalidparameters!

");

longlngValue=0;

lngValue+=bData[0];

lngValue=(lngValue<<8);

lngValue+=bData[1];

lngValue=(lngValue<<8);

lngValue+=bData[2];

lngValue=(lngValue<<8);

lngValue+=bData[3];

lngValue=(lngValue<<8);

lngValue+=bData[4];

lngValue=(lngValue<<8);

lngValue+=bData[5];

lngValue=(lngValue<<8);

lngValue+=bData[6];

lngValue=(lngValue<<8);

lngValue+=bData[7];

returnlngValue;

}

}

}

其中类的操作参看clsComposeFiles这个类,而文件索引结构参看FileIndex这个Structure。

之后的调用就很简单,例如:

合成文件:

clsComposeFilesmyComposeFiles=newclsComposeFiles();

myComposeFiles.AddFile(@"D:

\Ship.exe");

myComposeFiles.AddFile(@"D:

\LoginPage.JPG");

myComposeFiles.ComposeFiles(@"D:

\Ship.dat");

分解文件:

clsComposeFilesmyComposeFiles=newclsComposeFiles();

myComposeFiles.DecomposeFile(@"D:

\Ship.dat",@"E:

\");

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2