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