专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 分离文件:多文件写到一个文件再分离 »正文

分离文件:多文件写到一个文件再分离

来源: 发布时间:星期五, 2008年11月7日 浏览:146次 评论:0
对于一个文件的读写,其实很简单,就是用FileStream进行Read或者Write就行了。但是如何把多个文件写入到同一个文件,之后要能把这个文件进行还原成多个文件。那么光靠FileStreamReadWrite方法是不够的,首先你需要自行建立文件索引,来标明每个文件在当前文件的位置。

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

namespace ComposeFiles{
using System;
using System.IO;
using System.Collections;
using System.Text;
/// <summary>
/// Summary description for clsComposeFiles.
/// </summary>
public class clsComposeFiles
{
private ArrayList arrFiles = new ArrayList();

public clsComposeFiles()
{
//
// TODO: Add constructor logic here
//
}

/// <summary>
/// Add a file to be composed
/// </summary>
/// <param name="sFileName"></param>
public void AddFile( string sFileName )
{
arrFiles.Add( sFileName );
}

/// <summary>
/// Compose files to the specific file
/// </summary>
/// <param name="sFileName"></param>
/// <returns></returns>
public bool ComposeFiles( string sFileName )
{
if( arrFiles.Count == 0 ) return false;

FileInfo fi = new FileInfo( sFileName );
// Open file to write
FileStream fsWriter = null;
try
{
if( !fi.Exists )
{
fsWriter = new FileStream(
sFileName,
FileMode.CreateNew,
FileAccess.ReadWrite,
FileShare.None );
}
else
fsWriter = new FileStream(
sFileName,
FileMode.Truncate,
FileAccess.ReadWrite,
FileShare.None );
}
catch(Exception err)
{
System.Diagnostics.Debug.WriteLine( err.Message );
return false;
}

byte[] bBuffer = null;
// Write files count
bBuffer = FileIndex.LongToBytes( arrFiles.Count );
fsWriter.Write( bBuffer, 0, 8 );

const long INDEX_START_POS = 8L;
// Init files index
FileIndex FI = new FileIndex();
for( int i = 0; i < arrFiles.Count; i++ )
fsWriter.Write( FileIndex.ConvertToBytes( ref FI ), 0, 32 );

long FILE_START_POS = INDEX_START_POS + 32 * arrFiles.Count;
long lCurFileStartPos = FILE_START_POS;

// Write every file
for( int i = 0; i < arrFiles.Count; i++ )
{
WriteFile( arrFiles.ToString(),
ref lCurFileStartPos,
INDEX_START_POS,
fsWriter,
i );
}

// Close stream
fsWriter.Close();
return true;
}

/// <summary>
/// Write file name and data into composed file
/// </summary>
/// <param name="sFileName"></param>
/// <param name="FileStartPos"></param>
/// <param name="IndexStartPos"></param>
/// <param name="fsWriter"></param>
/// <param name="Index"></param>
private void WriteFile(
string sFileName,
ref long FileStartPos,
long IndexStartPos,
FileStream fsWriter,
int Index )
{
FileInfo fi = new FileInfo( sFileName );
if( !fi.Exists ) return;

FileStream fsReader = null;
try
{
fsReader = new FileStream(
sFileName, FileMode.Open,
FileAccess.Read );
}
catch{ return;}

// Get file name
byte[] bFileName = Encoding.Unicode.GetBytes( fi.Name );
// Write file name
fsWriter.Write( bFileName, 0, bFileName.Length );

const int BUFFER_LENGTH = 1024;
byte[] bBuffer = new byte[BUFFER_LENGTH];
int nRealRead = 0;
// Write data using
do
{
// Read data from file
nRealRead = fsReader.Read( bBuffer, 0,
BUFFER_LENGTH );
// Write data
fsWriter.Write( bBuffer, 0, nRealRead );
}while( nRealRead > 0 );
// Close file reader
fsReader.Close();

FileIndex FINew = new FileIndex();
FINew.NameStartPos = FileStartPos;
FINew.NameLength = bFileName.Length;
FINew.FileStartPos = FileStartPos + bFileName.Length;
FINew.FileLength = fi.Length;

// Go back to file index position
fsWriter.Seek( IndexStartPos + Index * 32, SeekOrigin.Begin );

// Write file index info
fsWriter.Write( FileIndex.ConvertToB
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: