• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            內存映射文件處理大文件

            首先通過GetFileSize()得到被處理文件長度(64位)的高32位和低32位值。然后在映射過程中設定每次映射的塊大小為1000倍的分配粒度(系統的數據分塊大小),如果文件長度小于1000倍的分配粒度時則將塊大小設置為文件的實際長度。在處理過程中由映射、訪問、撤消映射構成了一個循環處理。其中,每處理完一個文件塊后都通過關閉文件映射對象來對每個文件塊進行整理。CreateFileMapping()MapViewOfFile()等函數是專門用來進行內存文件映射處理用的。

                    // 創建文件對象
            HANDLE hFile = ::CreateFile(strFile, GENERIC_READ,FILE_SHARE_READ, NULL,
              OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);
            if (hFile == INVALID_HANDLE_VALUE)
            {
              TRACE("
            創建文件對象失敗,錯誤代碼:%d\r\n", GetLastError());
              return;
            }
            //
            創建文件映射對象
            HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
            if (hFileMap == NULL)
            {
              TRACE("
            創建文件映射對象失敗,錯誤代碼:%d\r\n", GetLastError()); 
              return;
            }
            //
            得到系統分配粒度
            SYSTEM_INFO SysInfo;
            GetSystemInfo(&SysInfo);
            DWORD dwGran = SysInfo.dwAllocationGranularity;
            //
            得到文件尺寸
            DWORD dwFileSizeHigh;
            __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
            qwFileSize |= (((__int64)dwFileSizeHigh) << 32);///MSDN

            // 偏移地址 
            __int64 qwFileOffset = 0;
            __int64 T_newmap = 900 * dwGran;
            //
            塊大小
            DWORD dwBlockBytes = 1000 * dwGran;//
            文件數據分段大小
            if (qwFileSize - qwFileOffset < dwBlockBytes)
              dwBlockBytes = (DWORD)qwFileSize;

            // 映射視圖
            char *lpbMapAddress = (char *)MapViewOfFile(hFileMap,FILE_MAP_READ,
              (DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
            if (lpbMapAddress == NULL)
            {
              TRACE("
            映射文件映射失敗,錯誤代碼:%d ", GetLastError());
              return;
            }
            //
            關閉文件對象
            CloseHandle(hFile);
            ///////////
            讀文件數據
            while(qwFileOffset < qwFileSize)
            {
              /********************           
            讀文件             ***************************/ 
              //read_eh(&lpbMapAddress)
            讀取已映射到內存的數據,

              //并將文件指針作相應后移(lpbMapAddress++),返回指針偏移量
              qwFileOffset = qwFileOffset + read_eh(&lpbMapAddress); //
            修改偏移量
              if (qwFileOffset > T_newmap)
              {//
            當數據讀到90%,為防數據溢出,需要映射在其后的數據  T_newmap
               UnmapViewOfFile(lpbMapAddress);//
            釋放當前映射
               if ((DWORD)(qwFileSize - T_newmap) < dwBlockBytes)
               dwBlockBytes = (DWORD)(qwFileSize - T_newmap);
               lpbMapAddress = (char *)MapViewOfFile(hFileMap,FILE_MAP_READ,
               (DWORD)(T_newmap >> 32), (DWORD)(T_newmap & 0xFFFFFFFF),dwBlockBytes);
               //
            修正參數
               lpbMapAddress = lpbMapAddress + qwFileOffset - T_newmap;
               T_newmap =T_newmap  + 900 * dwGran;
               if (lpbMapAddress == NULL)
               {
                TRACE("
            映射文件映射失敗,錯誤代碼:%d ", GetLastError());
                return;
               }
              }
            }
            //
            釋放最后數據塊映射
            UnmapViewOfFile(lpbMapAddress);
            //
            關閉文件映射對象句柄
            CloseHandle(hFileMap);

             

            posted on 2011-02-16 14:25 肥仔 閱讀(1566) 評論(0)  編輯 收藏 引用 所屬分類: Windows開發

            国产一区二区三区久久精品| 色播久久人人爽人人爽人人片aV| 性做久久久久久久久浪潮| 久久国产精品国语对白| 伊人久久大香线蕉精品不卡| 97精品依人久久久大香线蕉97| 热re99久久精品国99热| 国产成人久久777777| 99久久做夜夜爱天天做精品| 久久精品中文无码资源站| 国产精品九九久久免费视频| 波多野结衣久久精品| 伊人丁香狠狠色综合久久| 波多野结衣久久| 国产91久久精品一区二区| 要久久爱在线免费观看| 99久久无色码中文字幕人妻| 99久久精品免费观看国产| 色88久久久久高潮综合影院| 久久精品国产WWW456C0M| 久久偷看各类wc女厕嘘嘘| 久久亚洲中文字幕精品一区| 国内精品久久久久久99蜜桃| 久久午夜免费视频| 国产精品免费久久久久电影网| 久久亚洲精品无码AV红樱桃| 亚洲欧洲中文日韩久久AV乱码| 久久91精品久久91综合| 亚洲AV无码1区2区久久| 亚洲人成电影网站久久| 国产99久久久国产精品~~牛| 久久精品国产亚洲AV麻豆网站| 亚洲国产成人精品91久久久 | 久久久久亚洲精品男人的天堂| 亚洲精品乱码久久久久久自慰| 日韩久久无码免费毛片软件| 国产亚洲精午夜久久久久久| 亚洲一区中文字幕久久| 狠狠干狠狠久久| 久久国产精品99精品国产987| 蜜臀av性久久久久蜜臀aⅴ|