对于一个文件的读写,其实很简单,就是用FileStream进行Read或者Write就行了。但是如何把多个文件写入到同一个文件,之后要能把这个文件进行还原成多个文件。那么光靠FileStream的Read和Write方法是不够的,首先你需要自行建立文件索引,来标明每个文件在当前文件的位置。 g©™½¹”¯Š˜www.netcsharp.cn{äœØ±ðŽæŸ
g©™½¹”¯Š˜www.netcsharp.cn{äœØ±ðŽæŸ
g©™½¹”¯Š˜www.netcsharp.cn{äœØ±ðŽæŸ
对于一个文件的读写,其实很简单,就是用FileStream进行Read或者Write就行了。但是如何把多个文件写入到同一个文件,之后要能把这个文件进行还原成多个文件。那么光靠FileStreamReadWrite方法是不够的,首先你需要自行建立文件索引,来标明每个文件在当前文件的位置。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{äœØ±ðŽæŸ

//---Descriptionhis 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 );