如何把多个文件写入到一个文件中去并能分解[转]

http://blog.csdn.net/Knight94/archive/2006/05/17/742055.aspx

 

None.gif 对于一个文件的读写,其实很简单,就是用FileStream进行Read或者Write就行了。但是如何把多个文件写入到同一个文件,之后要能把这个文件进行还原成多个文件。那么光靠FileStream的Read和Write方法是不够的,首先你需要自行建立文件索引,来标明每个文件在当前文件的位置。
None.gif
None.gif 
None.gif
None.gif那么最近作了一个简单的DEMO,其中类的部分代码如下:
None.gif
None.gif
// ------------------------------- Compose Files ----------------------------------
None.gif
None.gif
// --------------------------------------------------------------------------------
None.gif
None.gif
// ---File:clsComposeFiles.cs
None.gif
None.gif
// ---Description:This file is to show how-to compose multi-files into one file 
None.gif
None.gif
//                and decompose one file to multi-files.
None.gif
None.gif
// ---Author:Knight
None.gif
None.gif
// ---Date:May.16, 2006
None.gif
None.gif
// --------------------------------------------------------------------------------
None.gif
None.gif
// ------------------------------{ Compose Files }---------------------------------
None.gif

None.gif 
None.gif
None.gif
namespace  ComposeFiles
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
using System;
InBlock.gif
InBlock.gif    
using System.IO;
InBlock.gif
InBlock.gif    
using System.Collections;
InBlock.gif
InBlock.gif    
using System.Text;
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif
InBlock.gif    
/// Summary description for clsComposeFiles.
InBlock.gif
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif
InBlock.gif    
public class clsComposeFiles
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
private ArrayList arrFiles = new ArrayList();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
public clsComposeFiles()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
//
InBlock.gif
InBlock.gif            
// TODO: Add constructor logic here
InBlock.gif
InBlock.gif            
//
InBlock.gif

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif
InBlock.gif        
/// Add a file to be composed
InBlock.gif
InBlock.gif        
/// </summary>
InBlock.gif
ExpandedSubBlockEnd.gif        
/// <param name="sFileName"></param>

InBlock.gif
InBlock.gif        
public void AddFile( string sFileName )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            arrFiles.Add( sFileName );
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif
InBlock.gif        
/// Compose files to the specific file
InBlock.gif
InBlock.gif        
/// </summary>
InBlock.gif
InBlock.gif        
/// <param name="sFileName"></param>
InBlock.gif
ExpandedSubBlockEnd.gif        
/// <returns></returns>

InBlock.gif
InBlock.gif        
public bool ComposeFiles( string sFileName )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
if( arrFiles.Count == 0 ) return false;
InBlock.gif
InBlock.gif            
InBlock.gif
InBlock.gif            FileInfo fi 
= new FileInfo( sFileName );
InBlock.gif
InBlock.gif            
// Open file to write
InBlock.gif

InBlock.gif            FileStream fsWriter 
= null;
InBlock.gif
InBlock.gif            
try
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                
if!fi.Exists )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif
InBlock.gif                    fsWriter 
= new FileStream( 
InBlock.gif
InBlock.gif                        sFileName, 
InBlock.gif
InBlock.gif                        FileMode.CreateNew, 
InBlock.gif
InBlock.gif                        FileAccess.ReadWrite,
InBlock.gif
InBlock.gif                        FileShare.None );
InBlock.gif
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
else
InBlock.gif
InBlock.gif                    fsWriter 
= new FileStream( 
InBlock.gif
InBlock.gif                        sFileName, 
InBlock.gif
InBlock.gif                        FileMode.Truncate, 
InBlock.gif
InBlock.gif                        FileAccess.ReadWrite,
InBlock.gif
InBlock.gif                        FileShare.None );
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
catch(Exception err)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                System.Diagnostics.Debug.WriteLine( err.Message );
InBlock.gif
InBlock.gif                
return false;
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
InBlock.gif
InBlock.gif            
byte[] bBuffer = null;
InBlock.gif
InBlock.gif            
// Write files count
InBlock.gif

InBlock.gif            bBuffer 
= FileIndex.LongToBytes( arrFiles.Count );
InBlock.gif
InBlock.gif            fsWriter.Write( bBuffer, 
08 );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
const long INDEX_START_POS = 8L;
InBlock.gif
InBlock.gif            
// Init files index
InBlock.gif

InBlock.gif            FileIndex FI 
= new FileIndex();
InBlock.gif
InBlock.gif            
forint i = 0; i < arrFiles.Count; i++ )
InBlock.gif
InBlock.gif                fsWriter.Write( FileIndex.ConvertToBytes( 
ref FI ), 032 );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
long FILE_START_POS = INDEX_START_POS + 32 * arrFiles.Count;
InBlock.gif
InBlock.gif            
long lCurFileStartPos = FILE_START_POS;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Write every file
InBlock.gif

InBlock.gif            
forint i = 0; i < arrFiles.Count; i++ )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                WriteFile( arrFiles[i].ToString(),
InBlock.gif
InBlock.gif                    
ref lCurFileStartPos,
InBlock.gif
InBlock.gif                    INDEX_START_POS,
InBlock.gif
InBlock.gif                    fsWriter,
InBlock.gif
InBlock.gif                    i );
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Close stream
InBlock.gif

InBlock.gif            fsWriter.Close();
InBlock.gif
InBlock.gif            
return true;
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif
InBlock.gif        
/// Write file name and data into composed file
InBlock.gif
InBlock.gif        
/// </summary>
InBlock.gif
InBlock.gif        
/// <param name="sFileName"></param>
InBlock.gif
InBlock.gif        
/// <param name="FileStartPos"></param>
InBlock.gif
InBlock.gif        
/// <param name="IndexStartPos"></param>
InBlock.gif
InBlock.gif        
/// <param name="fsWriter"></param>
InBlock.gif
ExpandedSubBlockEnd.gif        
/// <param name="Index"></param>

InBlock.gif
InBlock.gif        
private void WriteFile( 
InBlock.gif
InBlock.gif            
string sFileName, 
InBlock.gif
InBlock.gif            
ref long FileStartPos,
InBlock.gif
InBlock.gif            
long IndexStartPos,
InBlock.gif
InBlock.gif            FileStream fsWriter,
InBlock.gif
InBlock.gif            
int Index )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            FileInfo fi 
= new FileInfo( sFileName );
InBlock.gif
InBlock.gif            
if!fi.Exists ) return;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            FileStream fsReader 
= null;
InBlock.gif
InBlock.gif            
try
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                fsReader 
= new FileStream( 
InBlock.gif
InBlock.gif                    sFileName, FileMode.Open, 
InBlock.gif
InBlock.gif                    FileAccess.Read );
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
catchdot.gifreturn;}
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Get file name
InBlock.gif

InBlock.gif            
byte[] bFileName = Encoding.Unicode.GetBytes( fi.Name );
InBlock.gif
InBlock.gif            
// Write file name
InBlock.gif

InBlock.gif            fsWriter.Write( bFileName, 
0, bFileName.Length );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
const int BUFFER_LENGTH = 1024;
InBlock.gif
InBlock.gif            
byte[] bBuffer = new byte[BUFFER_LENGTH];
InBlock.gif
InBlock.gif            
int nRealRead = 0;
InBlock.gif
InBlock.gif            
// Write data using
InBlock.gif

InBlock.gif            
do
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                
// Read data from file
InBlock.gif

InBlock.gif                nRealRead 
= fsReader.Read( bBuffer, 0
InBlock.gif
InBlock.gif                    BUFFER_LENGTH );
InBlock.gif
InBlock.gif                
// Write data 
InBlock.gif

InBlock.gif                fsWriter.Write( bBuffer, 
0, nRealRead );
InBlock.gif
ExpandedSubBlockEnd.gif            }
while( nRealRead > 0 );
InBlock.gif
InBlock.gif            
// Close file reader
InBlock.gif

InBlock.gif            fsReader.Close();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            FileIndex FINew 
= new FileIndex();
InBlock.gif
InBlock.gif            FINew.NameStartPos 
= FileStartPos;
InBlock.gif
InBlock.gif            FINew.NameLength 
= bFileName.Length;
InBlock.gif
InBlock.gif            FINew.FileStartPos 
= FileStartPos + bFileName.Length;
InBlock.gif
InBlock.gif            FINew.FileLength 
= fi.Length;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Go back to file index position
InBlock.gif

InBlock.gif            fsWriter.Seek( IndexStartPos 
+ Index * 32, SeekOrigin.Begin );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Write file index info
InBlock.gif

InBlock.gif            fsWriter.Write( FileIndex.ConvertToBytes( 
ref FINew ), 032 );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Go back to file end
InBlock.gif

InBlock.gif            fsWriter.Seek( 
0, SeekOrigin.End );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Set file current position
InBlock.gif

InBlock.gif            FileStartPos 
+= bFileName.Length + fi.Length;
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif
InBlock.gif        
/// Decompose file to multi files into specific directory
InBlock.gif
InBlock.gif        
/// </summary>
InBlock.gif
InBlock.gif        
/// <param name="sFileName"></param>
InBlock.gif
InBlock.gif        
/// <param name="sDestDir"></param>
InBlock.gif
ExpandedSubBlockEnd.gif        
/// <returns></returns>

InBlock.gif
InBlock.gif        
public bool DecomposeFile( string sFileName, string sDestDir )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            FileInfo fi 
= new FileInfo( sFileName );
InBlock.gif
InBlock.gif            
if!fi.Exists ) return false;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            FileStream fsReader 
= null;
InBlock.gif
InBlock.gif            
try
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                fsReader 
= new FileStream( 
InBlock.gif
InBlock.gif                    sFileName, FileMode.Open, 
InBlock.gif
InBlock.gif                    FileAccess.Read );
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
catchdot.gifreturn false;}
InBlock.gif
InBlock.gif            
InBlock.gif
InBlock.gif            
// Read file count
InBlock.gif

InBlock.gif            
byte[] bFileCount = new byte[8];
InBlock.gif
InBlock.gif            
int nRealRead = 0;
InBlock.gif
InBlock.gif            nRealRead 
= fsReader.Read( bFileCount, 08 );
InBlock.gif
InBlock.gif            
if( nRealRead != 8 )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                fsReader.Close();
InBlock.gif
InBlock.gif                
return false;
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
long lFileCount = FileIndex.BytesToLong( bFileCount );
InBlock.gif
InBlock.gif            
if( lFileCount > 0 )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                
//Init file index array
InBlock.gif

InBlock.gif                FileIndex[] fiArray 
= new FileIndex[lFileCount];
InBlock.gif
InBlock.gif                
byte[] bFileIndex = new byte[32];
InBlock.gif
InBlock.gif                
forint i = 0; i < lFileCount; i++ )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif
InBlock.gif                    fsReader.Read( bFileIndex, 
032 );
InBlock.gif
InBlock.gif                    fiArray[i] 
= FileIndex.ConvertToFileIndex( bFileIndex );
InBlock.gif
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                
if( sDestDir[ sDestDir.Length - 1!= '\\' )
InBlock.gif
InBlock.gif                    sDestDir 
+= "\\";
InBlock.gif
InBlock.gif                
// Save every file into current directory
InBlock.gif

InBlock.gif                
forint i = 0; i < fiArray.Length; i++ )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif
InBlock.gif                    SaveFile( fsReader,
InBlock.gif
InBlock.gif                        
ref fiArray[i],
InBlock.gif
InBlock.gif                        sDestDir );
InBlock.gif
ExpandedSubBlockEnd.gif                }

InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Close file reader
InBlock.gif

InBlock.gif            fsReader.Close();
InBlock.gif
InBlock.gif            
return true;
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif
InBlock.gif        
/// Save every file into directory
InBlock.gif
InBlock.gif        
/// </summary>
InBlock.gif
InBlock.gif        
/// <param name="fsReader"></param>
InBlock.gif
InBlock.gif        
/// <param name="FI"></param>
InBlock.gif
ExpandedSubBlockEnd.gif        
/// <param name="sDestDir"></param>

InBlock.gif
InBlock.gif        
private void SaveFile( 
InBlock.gif
InBlock.gif            FileStream fsReader,
InBlock.gif
InBlock.gif            
ref FileIndex FI,
InBlock.gif
InBlock.gif            
string sDestDir )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
// Read file name
InBlock.gif

InBlock.gif            
byte[] bFileName = new byte[ FI.NameLength ];
InBlock.gif
InBlock.gif            
int nRealRead = fsReader.Read( bFileName, 0, bFileName.Length );
InBlock.gif
InBlock.gif            
if( nRealRead != bFileName.Length ) return;
InBlock.gif
InBlock.gif            
string sFileName = Encoding.Unicode.GetString( bFileName );
InBlock.gif
InBlock.gif            sFileName 
= sDestDir + sFileName;
InBlock.gif
InBlock.gif            FileInfo fi 
= new FileInfo( sFileName );
InBlock.gif
InBlock.gif            
// Open file to write
InBlock.gif

InBlock.gif            FileStream fsWriter 
= null;
InBlock.gif
InBlock.gif            
try
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                
if!fi.Exists )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif
InBlock.gif                    fsWriter 
= new FileStream( 
InBlock.gif
InBlock.gif                        sFileName, 
InBlock.gif
InBlock.gif                        FileMode.CreateNew, 
InBlock.gif
InBlock.gif                        FileAccess.ReadWrite,
InBlock.gif
InBlock.gif                        FileShare.None );
InBlock.gif
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
else
InBlock.gif
InBlock.gif                    fsWriter 
= new FileStream( 
InBlock.gif
InBlock.gif                        sFileName, 
InBlock.gif
InBlock.gif                        FileMode.Truncate, 
InBlock.gif
InBlock.gif                        FileAccess.ReadWrite,
InBlock.gif
InBlock.gif                        FileShare.None );
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
catch(Exception err)dot.gif{
InBlock.gif
InBlock.gif                System.Diagnostics.Debug.WriteLine( err.Message );
InBlock.gif
InBlock.gif                
return;
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif        
InBlock.gif
InBlock.gif            
// Init buffer  
InBlock.gif

InBlock.gif            
const int BUFFER_LENGTH = 1024;
InBlock.gif
InBlock.gif            
byte[] bBuffer = new byte[BUFFER_LENGTH];
InBlock.gif
InBlock.gif            
long lLeft = FI.FileLength;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// Copy file 
InBlock.gif

InBlock.gif            
do
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                
if( lLeft > BUFFER_LENGTH )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif
InBlock.gif                    fsReader.Read( bBuffer, 
0, BUFFER_LENGTH );
InBlock.gif
InBlock.gif                    fsWriter.Write( bBuffer, 
0, BUFFER_LENGTH );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                    lLeft 
-= BUFFER_LENGTH;
InBlock.gif
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
else
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif
InBlock.gif                    nRealRead 
= fsReader.Read( bBuffer, 0, (int)lLeft );
InBlock.gif
InBlock.gif                    fsWriter.Write( bBuffer, 
0, nRealRead );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                    lLeft 
-= nRealRead;
InBlock.gif
ExpandedSubBlockEnd.gif                }

InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
while( lLeft > 0 );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
// close file writer
InBlock.gif

InBlock.gif            fsWriter.Close();
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif
InBlock.gif    
/// File index data structure
InBlock.gif
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif
InBlock.gif    
public struct FileIndex
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
public long NameStartPos;
InBlock.gif
InBlock.gif        
public long NameLength;
InBlock.gif
InBlock.gif        
public long FileStartPos;
InBlock.gif
InBlock.gif        
public long FileLength;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
public static byte[] ConvertToBytes( ref FileIndex FI  )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
byte[] bData = new byte[32];
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            Array.Copy( LongToBytes( FI.NameStartPos ), 
0, bData, 08 );
InBlock.gif
InBlock.gif            Array.Copy( LongToBytes( FI.NameLength ), 
0, bData, 88 );
InBlock.gif
InBlock.gif            Array.Copy( LongToBytes( FI.FileStartPos ), 
0, bData, 168 );
InBlock.gif
InBlock.gif            Array.Copy( LongToBytes( FI.FileLength ), 
0, bData, 248 );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
return bData;
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
public static byte[] LongToBytes( long lValue )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
byte[] bData = new byte[8];
InBlock.gif
InBlock.gif    
InBlock.gif
InBlock.gif            bData[
0= (byte)( ( lValue >> 56 ) & 0xFF);
InBlock.gif
InBlock.gif            bData[
1= (byte)( ( lValue >> 48 ) & 0xFF);
InBlock.gif
InBlock.gif            bData[
2= (byte)( ( lValue >> 40 ) & 0xFF);
InBlock.gif
InBlock.gif            bData[
3= (byte)( ( lValue >> 32 ) & 0xFF);
InBlock.gif
InBlock.gif            bData[
4= (byte)( ( lValue >> 24 ) & 0xFF);
InBlock.gif
InBlock.gif            bData[
5= (byte)( ( lValue >> 16 ) & 0xFF);
InBlock.gif
InBlock.gif            bData[
6= (byte)( ( lValue >> 8 ) & 0xFF);
InBlock.gif
InBlock.gif            bData[
7= (byte)(lValue & 0xFF);
InBlock.gif
InBlock.gif            
return bData;
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
public static FileIndex ConvertToFileIndex( byte[] bData )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
if( bData == null || bData.Length != 32 ) 
InBlock.gif
InBlock.gif                
throw new Exception( "Invalid parameters!" );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            FileIndex FI 
= new FileIndex();
InBlock.gif
InBlock.gif            
byte[] bBuffer = new byte[8];
InBlock.gif
InBlock.gif            Array.Copy( bData, 
0, bBuffer, 08 );
InBlock.gif
InBlock.gif            FI.NameStartPos 
= BytesToLong( bBuffer );
InBlock.gif
InBlock.gif            Array.Copy( bData, 
8, bBuffer, 08 );
InBlock.gif
InBlock.gif            FI.NameLength 
= BytesToLong( bBuffer );
InBlock.gif
InBlock.gif            Array.Copy( bData, 
16, bBuffer, 08 );
InBlock.gif
InBlock.gif            FI.FileStartPos 
= BytesToLong( bBuffer );
InBlock.gif
InBlock.gif            Array.Copy( bData, 
24, bBuffer, 08 );
InBlock.gif
InBlock.gif            FI.FileLength 
= BytesToLong( bBuffer );
InBlock.gif
InBlock.gif            
return FI;
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
public static long BytesToLong( byte[] bData )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
if( bData == null || bData.Length != 8 )
InBlock.gif
InBlock.gif                
throw new Exception( "Invalid parameters!" );
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif            
long lngValue = 0;
InBlock.gif
InBlock.gif            lngValue 
+= bData[0];
InBlock.gif
InBlock.gif            lngValue 
= ( lngValue << 8 );
InBlock.gif
InBlock.gif            lngValue 
+= bData[1];
InBlock.gif
InBlock.gif            lngValue 
= ( lngValue << 8 );
InBlock.gif
InBlock.gif            lngValue 
+= bData[2];
InBlock.gif
InBlock.gif            lngValue 
= ( lngValue << 8 );
InBlock.gif
InBlock.gif            lngValue 
+= bData[3];
InBlock.gif
InBlock.gif            lngValue 
= ( lngValue << 8 );
InBlock.gif
InBlock.gif            lngValue 
+= bData[4];
InBlock.gif
InBlock.gif            lngValue 
= ( lngValue << 8 );
InBlock.gif
InBlock.gif            lngValue 
+= bData[5];
InBlock.gif
InBlock.gif            lngValue 
= ( lngValue << 8 );
InBlock.gif
InBlock.gif            lngValue 
+= bData[6];
InBlock.gif
InBlock.gif            lngValue 
= ( lngValue << 8 );
InBlock.gif
InBlock.gif            lngValue 
+= bData[7];
InBlock.gif
InBlock.gif            
return lngValue;
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif 
None.gif
None.gif其中类的操作参看clsComposeFiles这个类,而文件索引结构参看FileIndex这个Structure。
None.gif
None.gif 
None.gif
None.gif之后的调用就很简单,例如:
None.gif
None.gif合成文件:
None.gif
None.gif    clsComposeFiles myComposeFiles 
=   new  clsComposeFiles();
None.gif
None.gif    myComposeFiles.AddFile( 
@" D:\Ship.exe "  );
None.gif
None.gif    myComposeFiles.AddFile( 
@" D:\LoginPage.JPG "  );
None.gif
None.gifmyComposeFiles.ComposeFiles( 
@" D:\Ship.dat "  );
None.gif
None.gif 
None.gif
None.gif分解文件:
None.gif
None.gif    clsComposeFiles myComposeFiles 
=   new  clsComposeFiles();
None.gif
None.gif    myComposeFiles.DecomposeFile( 
@" D:\Ship.dat " @" E:\ "  );
None.gif
None.gif 
None.gif
None.gif以上代码由于写得比较急,细节处理并不是很完善,因此使用的时候要加以细化,甚至可以在我的基础上进行扩充。
None.gif
None.gif

转载于:https://www.cnblogs.com/fxwdl/archive/2006/10/10/524915.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值