1、如何把多个文件写入到一个文件中去并能分解如何把多个文件写入到一个文件中去并能分解.txt如果你同时爱几个人,说明你年轻;如果你只爱一个人,那么,你已经老了;如果你谁也不爱,你已获得重生。积极的人一定有一个坚持的习惯。对于一个文件的读写,其实很简单,就是用FileStream进行Read或者Write就行了。但是如何把多个文件写入到同一个文件,之后要能把这个文件进行还原成多个文件。那么光靠FileStream的Read和Write方法是不够的,首先你需要自行建立文件索引,来标明每个文件在当前文件的位置。 那么最近作了一个简单的DEMO,其中类的部分代码如下:/- Compose Files -/
2、-/-File:clsComposeFiles.cs/-Description:This file is to show how-to compose multi-files into one file / and decompose one file to multi-files./-Author:Knight/-Date:May.16, 2006/-/- Compose Files - namespace ComposeFiles using System; using System.IO; using System.Collections; using System.Text; / /
3、Summary description for clsComposeFiles. / public class clsComposeFiles private ArrayList arrFiles = new ArrayList(); public clsComposeFiles() / / TODO: Add constructor logic here / / / Add a file to be composed / / public void AddFile( string sFileName ) arrFiles.Add( sFileName ); / / Compose files
4、 to the specific file / / / 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.ReadWrit
5、e, 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 );
6、 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
7、 = FILE_START_POS; / Write every file for( int i = 0; i arrFiles.Count; i+ ) WriteFile( arrFilesi.ToString(), ref lCurFileStartPos, INDEX_START_POS, fsWriter, i ); / Close stream fsWriter.Close(); return true; / / Write file name and data into composed file / / / / / / private void WriteFile( string
8、 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 bFileNa
9、me = Encoding.Unicode.GetBytes( fi.Name ); / Write file name fsWriter.Write( bFileName, 0, bFileName.Length ); const int BUFFER_LENGTH = 1024; byte bBuffer = new byteBUFFER_LENGTH; int nRealRead = 0; / Write data using do / Read data from file nRealRead = fsReader.Read( bBuffer, 0, BUFFER_LENGTH );
10、/ 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.Len
11、gth; / Go back to file index position fsWriter.Seek( IndexStartPos + Index * 32, SeekOrigin.Begin ); / Write file index info fsWriter.Write( FileIndex.ConvertToBytes( ref FINew ), 0, 32 ); / Go back to file end fsWriter.Seek( 0, SeekOrigin.End ); / Set file current position FileStartPos += bFileName
12、.Length + fi.Length; / / Decompose file to multi files into specific directory / / / / public bool DecomposeFile( string sFileName, string sDestDir ) FileInfo fi = new FileInfo( sFileName ); if( !fi.Exists ) return false; FileStream fsReader = null; try fsReader = new FileStream( sFileName, FileMode
13、.Open, FileAccess.Read ); catch return false; / Read file count byte bFileCount = new byte8; int nRealRead = 0; nRealRead = fsReader.Read( bFileCount, 0, 8 ); if( nRealRead != 8 ) fsReader.Close(); return false; long lFileCount = FileIndex.BytesToLong( bFileCount ); if( lFileCount 0 ) /Init file ind
14、ex array FileIndex fiArray = new FileIndexlFileCount; byte bFileIndex = new byte32; for( int i = 0; i lFileCount; i+ ) fsReader.Read( bFileIndex, 0, 32 ); fiArrayi = FileIndex.ConvertToFileIndex( bFileIndex ); if( sDestDir sDestDir.Length - 1 != ) sDestDir += ; / Save every file into current directo
15、ry for( int i = 0; i fiArray.Length; i+ ) SaveFile( fsReader, ref fiArrayi, sDestDir ); / Close file reader fsReader.Close(); return true; / / Save every file into directory / / / / private void SaveFile( FileStream fsReader, ref FileIndex FI, string sDestDir ) / Read file name byte bFileName = new
16、byte FI.NameLength ; int nRealRead = fsReader.Read( bFileName, 0, bFileName.Length ); if( nRealRead != bFileName.Length ) return; string sFileName = Encoding.Unicode.GetString( bFileName ); sFileName = sDestDir + sFileName; FileInfo fi = new FileInfo( sFileName ); / Open file to write FileStream fsW
17、riter = 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.Mess
18、age ); return; / Init buffer const int BUFFER_LENGTH = 1024; byte bBuffer = new byteBUFFER_LENGTH; long lLeft = FI.FileLength; / Copy file do if( lLeft BUFFER_LENGTH ) fsReader.Read( bBuffer, 0, BUFFER_LENGTH ); fsWriter.Write( bBuffer, 0, BUFFER_LENGTH ); lLeft -= BUFFER_LENGTH; else nRealRead = fs
19、Reader.Read( bBuffer, 0, (int)lLeft ); fsWriter.Write( bBuffer, 0, nRealRead ); lLeft -= nRealRead; while( lLeft 0 ); / close file writer fsWriter.Close(); / / File index data structure / public struct FileIndex public long NameStartPos; public long NameLength; public long FileStartPos; public long
20、FileLength; public static byte ConvertToBytes( ref FileIndex FI ) byte bData = new byte32; 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(
21、 FI.FileLength ), 0, bData, 24, 8 ); return bData; public static byte LongToBytes( long lValue ) byte bData = new byte8; bData0 = (byte)( ( lValue 56 ) & 0xFF); bData1 = (byte)( ( lValue 48 ) & 0xFF); bData2 = (byte)( ( lValue 40 ) & 0xFF); bData3 = (byte)( ( lValue 32 ) & 0xFF); bData4 = (byte)( (
22、lValue 24 ) & 0xFF); bData5 = (byte)( ( lValue 16 ) & 0xFF); bData6 = (byte)( ( lValue 8 ) & 0xFF); bData7 = (byte)(lValue & 0xFF); return bData; public static FileIndex ConvertToFileIndex( byte bData ) if( bData = null | bData.Length != 32 ) throw new Exception( Invalid parameters! ); FileIndex FI
23、= new FileIndex(); byte bBuffer = new byte8; 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( b
24、Data, 24, bBuffer, 0, 8 ); FI.FileLength = BytesToLong( bBuffer ); return FI; public static long BytesToLong( byte bData ) if( bData = null | bData.Length != 8 ) throw new Exception( Invalid parameters! ); long lngValue = 0; lngValue += bData0; lngValue = ( lngValue 8 ); lngValue += bData1; lngValue
25、 = ( lngValue 8 ); lngValue += bData2; lngValue = ( lngValue 8 ); lngValue += bData3; lngValue = ( lngValue 8 ); lngValue += bData4; lngValue = ( lngValue 8 ); lngValue += bData5; lngValue = ( lngValue 8 ); lngValue += bData6; lngValue = ( lngValue 8 ); lngValue += bData7; return lngValue; 其中类的操作参看c
26、lsComposeFiles这个类,而文件索引结构参看FileIndex这个Structure。 之后的调用就很简单,例如:合成文件: clsComposeFiles myComposeFiles = new clsComposeFiles(); myComposeFiles.AddFile( D:Ship.exe ); myComposeFiles.AddFile( D:LoginPage.JPG );myComposeFiles.ComposeFiles( D:Ship.dat ); 分解文件: clsComposeFiles myComposeFiles = new clsComposeFiles(); myComposeFiles.DecomposeFile( D:Ship.dat, E: );
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2