青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

We do not always find visible happiness in proportion to visible virtue

夢幻白樺林

SHARE

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  14 Posts :: 58 Stories :: 62 Comments :: 0 Trackbacks

公告

常用鏈接

留言簿(5)

搜索

  •  

最新隨筆

最新評論

閱讀排行榜

對于一個文件的讀寫,其實很簡單,就是用FileStream進行Read或者Write就行了。但是如何把多個文件寫入到同一個文件,之后要能把這個文件進行還原成多個文件。那么光靠FileStreamReadWrite方法是不夠的,首先你需要自行建立文件索引,來標明每個文件在當前文件的位置。

 

那么最近作了一個簡單的DEMO,其中類的部分代碼如下:

//------------------------------- Compose Files ----------------------------------

//--------------------------------------------------------------------------------

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

 

    /// <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[i].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.ConvertToBytes( ref FINew ), 0, 32 );

 

            // Go back to file end

            fsWriter.Seek( 0, SeekOrigin.End );

 

            // Set file current position

            FileStartPos += bFileName.Length + fi.Length;

        }

 

        /// <summary>

        /// Decompose file to multi files into specific directory

        /// </summary>

        /// <param name="sFileName"></param>

        /// <param name="sDestDir"></param>

        /// <returns></returns>

        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.Open,

                    FileAccess.Read );

            }

            catch{ return false;}

           

            // Read file count

            byte[] bFileCount = new byte[8];

            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 index array

                FileIndex[] fiArray = new FileIndex[lFileCount];

                byte[] bFileIndex = new byte[32];

                for( int i = 0; i < lFileCount; i++ )

                {

                    fsReader.Read( bFileIndex, 0, 32 );

                    fiArray[i] = FileIndex.ConvertToFileIndex( bFileIndex );

                }

 

                if( sDestDir[ sDestDir.Length - 1] != '\\' )

                    sDestDir += "\\";

                // Save every file into current directory

                for( int i = 0; i < fiArray.Length; i++ )

                {

                    SaveFile( fsReader,

                        ref fiArray[i],

                        sDestDir );

                }

            }

 

            // Close file reader

            fsReader.Close();

            return true;

        }

 

        /// <summary>

        /// Save every file into directory

        /// </summary>

        /// <param name="fsReader"></param>

        /// <param name="FI"></param>

        /// <param name="sDestDir"></param>

        private void SaveFile(

            FileStream fsReader,

            ref FileIndex FI,

            string sDestDir )

        {

            // Read file name

            byte[] bFileName = new 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 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;

            }

       

            // Init buffer 

            const int BUFFER_LENGTH = 1024;

            byte[] bBuffer = new byte[BUFFER_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 = fsReader.Read( bBuffer, 0, (int)lLeft );

                    fsWriter.Write( bBuffer, 0, nRealRead );

 

                    lLeft -= nRealRead;

                }

            }

            while( lLeft > 0 );

 

            // close file writer

            fsWriter.Close();

        }

    }

 

    /// <summary>

    /// File index data structure

    /// </summary>

    public struct FileIndex

    {

        public long NameStartPos;

        public long NameLength;

        public long FileStartPos;

        public long FileLength;

 

        public static byte[] ConvertToBytes( ref FileIndex FI  )

        {

            byte[] bData = new byte[32];

 

            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( FI.FileLength ), 0, bData, 24, 8 );

 

            return bData;

        }

 

        public static byte[] LongToBytes( long lValue )

        {

            byte[] bData = new byte[8];

   

            bData[0] = (byte)( ( lValue >> 56 ) & 0xFF);

            bData[1] = (byte)( ( lValue >> 48 ) & 0xFF);

            bData[2] = (byte)( ( lValue >> 40 ) & 0xFF);

            bData[3] = (byte)( ( lValue >> 32 ) & 0xFF);

            bData[4] = (byte)( ( lValue >> 24 ) & 0xFF);

            bData[5] = (byte)( ( lValue >> 16 ) & 0xFF);

            bData[6] = (byte)( ( lValue >> 8 ) & 0xFF);

            bData[7] = (byte)(lValue & 0xFF);

            return bData;

        }

 

        public static FileIndex ConvertToFileIndex( byte[] bData )

        {

            if( bData == null || bData.Length != 32 )

                throw new Exception( "Invalid parameters!" );

 

            FileIndex FI = new FileIndex();

            byte[] bBuffer = new byte[8];

            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( bData, 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 += bData[0];

            lngValue = ( lngValue << 8 );

            lngValue += bData[1];

            lngValue = ( lngValue << 8 );

            lngValue += bData[2];

            lngValue = ( lngValue << 8 );

            lngValue += bData[3];

            lngValue = ( lngValue << 8 );

            lngValue += bData[4];

            lngValue = ( lngValue << 8 );

            lngValue += bData[5];

            lngValue = ( lngValue << 8 );

            lngValue += bData[6];

            lngValue = ( lngValue << 8 );

            lngValue += bData[7];

            return lngValue;

        }

    }

}

 

其中類的操作參看clsComposeFiles這個類,而文件索引結(jié)構(gòu)參看FileIndex這個Structure

 

之后的調(diào)用就很簡單,例如:

合成文件:

    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:\" );
posted on 2007-10-08 11:50 colys 閱讀(468) 評論(0)  編輯 收藏 引用 所屬分類: C#.Net

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区在线免费观看| 亚洲国产一区二区精品专区| 国产精品毛片在线| 一区在线播放| 午夜一级久久| 亚洲国产视频a| 一区二区高清在线观看| 久久久另类综合| 国产精一区二区三区| 日韩亚洲欧美一区| 亚洲国产精品一区在线观看不卡| 欧美激情网友自拍| 久久九九免费| 国产一区二区三区四区在线观看| 亚洲女同性videos| 欧美日韩的一区二区| 亚洲高清在线| 欧美成人r级一区二区三区| 欧美一区二区三区四区在线观看| 亚洲欧洲精品一区| 中文国产亚洲喷潮| 欧美日韩精品在线播放| 在线观看日韩av电影| 久久婷婷成人综合色| 久久久精品免费视频| 久久国产夜色精品鲁鲁99| 国产在线精品一区二区中文| 一本久久a久久精品亚洲| 欧美电影在线观看| 免费av成人在线| 亚洲国产精品久久久久秋霞不卡 | 欧美在线啊v一区| 亚洲一区二区动漫| 日韩视频在线观看一区二区| 欧美日韩国产综合网| 影音先锋久久精品| 女主播福利一区| 久久精品国产亚洲精品| 欧美一区激情视频在线观看| 国产一区二区看久久| 久久久久久精| 女同性一区二区三区人了人一| 欧美va亚洲va国产综合| 毛片精品免费在线观看| 亚洲黄页一区| 亚洲日本在线视频观看| 欧美精品久久久久久久| 亚洲男人第一av网站| 亚洲嫩草精品久久| 国内精品写真在线观看| 久久se精品一区精品二区| 欧美在线地址| 国产亚洲一区二区在线观看| 欧美一区=区| 久久综合九色综合欧美狠狠| 国产亚洲精品bt天堂精选| 性欧美在线看片a免费观看| 欧美一区二区三区免费观看视频| 亚洲天堂黄色| 亚洲自拍都市欧美小说| 国产精品乱码一区二区三区 | 欧美亚洲免费高清在线观看| 亚洲一区二区精品| 国产精品美女999| 欧美一站二站| 欧美黑人一区二区三区| 99re视频这里只有精品| 国产精品久久久久久久久动漫| 久久男人av资源网站| 国内精品久久久久久| 久久综合狠狠综合久久综合88| 激情视频一区| 国产精品久久久久一区| 国产欧美日韩在线播放| 狠狠久久亚洲欧美专区| 国产精品久久一级| 狠狠噜噜久久| 欧美一区视频| 欧美jizz19性欧美| 国产一区二区主播在线 | 久久夜色精品国产| 久久久91精品国产| 一区二区三区中文在线观看 | 国一区二区在线观看| 久久久www免费人成黑人精品 | 农村妇女精品| 最近中文字幕日韩精品| 一区二区三区日韩欧美| 国产精品热久久久久夜色精品三区| 亚洲一区二区三区精品在线 | 久久精品国产成人| 一色屋精品视频免费看| 欧美日本精品一区二区三区| 午夜国产一区| 亚洲国产专区校园欧美| 亚洲欧美成人精品| 在线电影院国产精品| 欧美日一区二区在线观看| 欧美在线视频一区二区| 亚洲乱码国产乱码精品精可以看| 亚洲国产女人aaa毛片在线| 欧美少妇一区二区| 久久一区二区三区四区| 亚洲精选国产| 久久人体大胆视频| 亚洲免费影视| 亚洲精品永久免费| 狠狠色狠色综合曰曰| 国产精品二区二区三区| 免费一区二区三区| 欧美中文字幕精品| 在线视频日韩| 亚洲欧洲一区| 欧美成人四级电影| 久久久久久久网站| 香蕉亚洲视频| 亚洲一区二区在线播放| 亚洲精品综合精品自拍| 在线播放日韩| 国产一区二区无遮挡| 国产精品一区二区久久久久| 欧美日韩国产一区二区| 欧美成人免费观看| 午夜精品一区二区在线观看| 日韩亚洲一区在线播放| 欧美国产一区视频在线观看| 国产精品日韩精品欧美精品| 久久夜色精品国产噜噜av| 欧美亚韩一区| 中文日韩电影网站| 亚洲伊人观看| 一区在线观看| 亚洲精品一级| 狠狠入ady亚洲精品经典电影| 欧美天堂亚洲电影院在线播放 | 亚洲国产精品123| 一级日韩一区在线观看| 国产午夜亚洲精品不卡| 欧美精品日韩综合在线| 男男成人高潮片免费网站| 久久国产精品高清| 性欧美暴力猛交69hd| 亚洲一区二区三区高清| 亚洲一二三区在线观看| 亚洲专区一区二区三区| 亚洲女性裸体视频| 欧美一区二区性| 久久久999精品免费| 久久精品一区四区| 久久深夜福利免费观看| 猫咪成人在线观看| 欧美日本国产| 国产精品久久久一区麻豆最新章节| 亚洲影视在线播放| 亚洲午夜精品久久| 亚洲女人天堂成人av在线| 午夜精品av| 久久久久久久久蜜桃| 久久午夜电影| 欧美精品一区二区在线观看| 欧美日韩免费区域视频在线观看| 欧美一级专区| 欧美影院一区| 免费不卡在线视频| 欧美日韩亚洲视频| 国产欧美日本在线| 亚洲大胆在线| 亚洲一区二区综合| 久久久激情视频| 欧美激情亚洲国产| 亚洲最新色图| 久久成人av少妇免费| 欧美大片18| 国产精品影音先锋| 亚洲风情亚aⅴ在线发布| 亚洲午夜精品17c| 久久三级福利| 一本色道久久综合狠狠躁篇怎么玩 | 久久久久一本一区二区青青蜜月| 最新中文字幕亚洲| 99综合在线| 久久国内精品视频| 欧美欧美午夜aⅴ在线观看| 国产精品扒开腿做爽爽爽视频| 欧美电影美腿模特1979在线看| 亚洲一区二区三区精品视频| 午夜精品偷拍| 欧美激情精品久久久久久| 国产精品伊人日日| 一本在线高清不卡dvd| 久久一区二区三区国产精品 | 亚洲伦理在线观看| 日韩午夜激情av| 国产精品一区三区| 欧美精品1区| 欧美激情精品久久久久久大尺度 | 激情综合色综合久久综合| 久久久国产视频91| 亚洲国产女人aaa毛片在线| 一区二区久久久久久|