对于一个文件的读写,其实很简单,就是用FileStream进行Read或者Write就行了。但是如何把多个文件写入到同一个文件,之后要能把这个文件进行还原成多个文件。那么光靠FileStream的Read和Write方法是不够的,首先你需要自行建立文件索引,来标明每个文件在当前文件的位置。
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ对于一个文件的读写,其实很简单,就是用FileStream进行Read或者Write就行了。但是如何把多个文件写入到同一个文件,之后要能把这个文件进行还原成多个文件。那么光靠FileStream的Read和Write方法是不够的,首先你需要自行建立文件索引,来标明每个文件在当前文件的位置。g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ那么最近作了一个简单的DEMO,其中类的部分代码如下:g©½¹¯www.netcsharp.cn{䨱ðæ//------------------------------- Compose Files ----------------------------------
g©½¹¯www.netcsharp.cn{䨱ðæ//--------------------------------------------------------------------------------
g©½¹¯www.netcsharp.cn{䨱ðæ//---File:clsComposeFiles.cs
g©½¹¯www.netcsharp.cn{䨱ðæ//---Description
his file is to show how-to compose multi-files into one file
g©½¹¯www.netcsharp.cn{䨱ðæ//g©½¹¯www.netcsharp.cn{䨱ðæ
and decompose one file to multi-files.
g©½¹¯www.netcsharp.cn{䨱ðæ//---Author:Knight
g©½¹¯www.netcsharp.cn{䨱ðæ//---Date:May.16, 2006
g©½¹¯www.netcsharp.cn{䨱ðæ//--------------------------------------------------------------------------------
g©½¹¯www.netcsharp.cn{䨱ðæ//------------------------------{ Compose Files }---------------------------------
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðænamespace ComposeFiles
g©½¹¯www.netcsharp.cn{䨱ðæ{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
using System;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
using System.IO;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
using System.Collections;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
using System.Text;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
/// Summary description for clsComposeFiles.
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
</summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
public class clsComposeFiles
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
private ArrayList arrFiles = new ArrayList();
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
public clsComposeFiles()
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
//
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// TODO: Add constructor logic here
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
//
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
/// Add a file to be composed
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
</summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="sFileName"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
public void AddFile( string sFileName )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
arrFiles.Add( sFileName );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
/// Compose files to the specific file
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
</summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="sFileName"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<returns></returns>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
public bool ComposeFiles( string sFileName )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( arrFiles.Count == 0 ) return false;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileInfo fi = new FileInfo( sFileName );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Open file to write
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileStream fsWriter = null;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
try
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( !fi.Exists )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter = new FileStream(
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
sFileName,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileMode.CreateNew,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileAccess.ReadWrite,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileShare.None );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
else
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter = new FileStream(
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
sFileName,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileMode.Truncate,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileAccess.ReadWrite,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileShare.None );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
catch(Exception err)
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
System.Diagnostics.Debug.WriteLine( err.Message );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
return false;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
byte[] bBuffer = null;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Write files count
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
bBuffer = FileIndex.LongToBytes( arrFiles.Count );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Write( bBuffer, 0, 8 );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
const long INDEX_START_POS = 8L;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Init files index
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileIndex FI = new FileIndex();
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
for( int i = 0; i < arrFiles.Count; i++ )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Write( FileIndex.ConvertToBytes( ref FI ), 0, 32 );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
long FILE_START_POS = INDEX_START_POS + 32 * arrFiles.Count;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
long lCurFileStartPos = FILE_START_POS;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Write every file
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
for( int i = 0; i < arrFiles.Count; i++ )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
WriteFile( arrFiles.ToString(),
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
ref lCurFileStartPos,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
INDEX_START_POS,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
i );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Close stream
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Close();
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
return true;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
/// Write file name and data into composed file
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
</summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="sFileName"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="FileStartPos"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="IndexStartPos"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="fsWriter"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="Index"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
private void WriteFile(
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
string sFileName,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
ref long FileStartPos,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
long IndexStartPos,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileStream fsWriter,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
int Index )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileInfo fi = new FileInfo( sFileName );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( !fi.Exists ) return;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileStream fsReader = null;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
try
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsReader = new FileStream(
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
g©½¹¯www.netcsharp.cn{䨱ðæ
sFileName, FileMode.Open,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileAccess.Read );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
catch{ return;}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Get file name
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
byte[] bFileName = Encoding.Unicode.GetBytes( fi.Name );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Write file name
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Write( bFileName, 0, bFileName.Length );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
const int BUFFER_LENGTH = 1024;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
byte[] bBuffer = new byte[BUFFER_LENGTH];
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
int nRealRead = 0;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Write data using
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
do
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Read data from file
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
nRealRead = fsReader.Read( bBuffer, 0,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
BUFFER_LENGTH );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Write data
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Write( bBuffer, 0, nRealRead );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}while( nRealRead > 0 );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Close file reader
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsReader.Close();
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileIndex FINew = new FileIndex();
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FINew.NameStartPos = FileStartPos;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FINew.NameLength = bFileName.Length;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FINew.FileStartPos = FileStartPos + bFileName.Length;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FINew.FileLength = fi.Length;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Go back to file index position
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Seek( IndexStartPos + Index * 32, SeekOrigin.Begin );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Write file index info
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Write( FileIndex.ConvertToBytes( ref FINew ), 0, 32 );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Go back to file end
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Seek( 0, SeekOrigin.End );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Set file current position
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileStartPos += bFileName.Length + fi.Length;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
/// Decompose file to multi files into specific directory
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
</summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="sFileName"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="sDestDir"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<returns></returns>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
public bool DecomposeFile( string sFileName, string sDestDir )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileInfo fi = new FileInfo( sFileName );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( !fi.Exists ) return false;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileStream fsReader = null;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
try
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsReader = new FileStream(
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
sFileName, FileMode.Open,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileAccess.Read );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
catch{ return false;}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Read file count
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
byte[] bFileCount = new byte[8];
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
int nRealRead = 0;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
nRealRead = fsReader.Read( bFileCount, 0, 8 );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( nRealRead != 8 )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsReader.Close();
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
return false;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
long lFileCount = FileIndex.BytesToLong( bFileCount );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( lFileCount > 0 )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
//Init file index array
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileIndex[] fiArray = new FileIndex[lFileCount];
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
byte[] bFileIndex = new byte[32];
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
for( int i = 0; i < lFileCount; i++ )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsReader.Read( bFileIndex, 0, 32 );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fiArray = FileIndex.ConvertToFileIndex( bFileIndex );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( sDestDir[ sDestDir.Length - 1] != '\\' )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
sDestDir += "\\";
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Save every file into current directory
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
for( int i = 0; i < fiArray.Length; i++ )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
SaveFile( fsReader,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
ref fiArray,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
sDestDir );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Close file reader
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsReader.Close();
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
return true;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
/// Save every file into directory
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
</summary>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="fsReader"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="FI"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
///g©½¹¯www.netcsharp.cn{䨱ðæ
<param name="sDestDir"></param>
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
private void SaveFile(
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileStream fsReader,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
ref FileIndex FI,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
string sDestDir )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Read file name
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
byte[] bFileName = new byte[ FI.NameLength ];
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
int nRealRead = fsReader.Read( bFileName, 0, bFileName.Length );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( nRealRead != bFileName.Length ) return;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
string sFileName = Encoding.Unicode.GetString( bFileName );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
sFileName = sDestDir + sFileName;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileInfo fi = new FileInfo( sFileName );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Open file to write
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileStream fsWriter = null;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
try
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( !fi.Exists )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter = new FileStream(
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
sFileName,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileMode.CreateNew,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileAccess.ReadWrite,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileShare.None );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
else
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter = new FileStream(
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
sFileName,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileMode.Truncate,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileAccess.ReadWrite,
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
FileShare.None );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
catch(Exception err){
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
System.Diagnostics.Debug.WriteLine( err.Message );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
return;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Init bufferg©½¹¯www.netcsharp.cn{䨱ðæ
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
const int BUFFER_LENGTH = 1024;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
byte[] bBuffer = new byte[BUFFER_LENGTH];
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
long lLeft = FI.FileLength;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
// Copy file
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
do
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
if( lLeft > BUFFER_LENGTH )
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsReader.Read( bBuffer, 0, BUFFER_LENGTH );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Write( bBuffer, 0, BUFFER_LENGTH );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
lLeft -= BUFFER_LENGTH;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
else
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
{
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
nRealRead = fsReader.Read( bBuffer, 0, (int)lLeft );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
fsWriter.Write( bBuffer, 0, nRealRead );
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
lLeft -= nRealRead;
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
}
g©½¹¯www.netcsharp.cn{䨱ðæg©½¹¯www.netcsharp.cn{䨱ðæ
while( lLeft > 0 );