如何把多个文件写入到一个文件中去并能分解.docx
《如何把多个文件写入到一个文件中去并能分解.docx》由会员分享,可在线阅读,更多相关《如何把多个文件写入到一个文件中去并能分解.docx(16页珍藏版)》请在冰点文库上搜索。
如何把多个文件写入到一个文件中去并能分解
如何把多个文件写入到一个文件中去并能分解.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;ifsWriter.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:
\");