亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi 中內存映射對于大文件的使用

2020-01-31 20:50:18
字體:
來源:轉載
供稿:網友

Delphi 中內存映射對于大文件的使用

平時很少使用大文件的內存映射,碰巧遇到了這樣的要求,所以把過程記錄下來,當給各位一個引子吧,因為應用不算復雜,可能有考慮不到的地方,歡迎交流。

對于一些小文件,用普通的文件流就可以很好的解決,可是對于超大文件,比如2G或者更多,文件流就不行了,所以要使用API的內存映射的相關方法,即使是內存映射,也不能一次映射全部文件的大小,所以必須采取分塊映射,每次處理一小部分。

 先來看幾個函數

CreateFile :打開文件

GetFileSize : 獲取文件尺寸

CreateFileMapping :創建映射

MapViewOfFile :映射文件

看MapViewOfFile的幫助,他的最后兩個參數都需要是頁面粒度的整數倍,一般機器的頁面粒度為64k(65536字節),而我們實際操作中,一般都不是這樣規矩的,任意位置,任意長度都是可能的,所以就要做一些處理。

本例的任務是從一個長度列表中(FInfoList),依次讀取長度值,然后到另外一個大文件(FSourceFileName)中去順序讀取指定長度的數據,如果是小文件,這個就好辦了,一次讀到文件流中,然后依次讀取就是了,大數對于大文件,就需要不斷改變映射的位置,來取得我們想要的數據。

本例中顯示先通過GetSystemInfo來獲取頁面粒度,然后以10倍的頁面粒度為一個映射數據塊,在for循環中,會判斷已經讀取的長度(totallen)加上即將讀取的長度,是否在本次映射范圍之內(10倍的頁面粒度),如果在就繼續讀取,如果超出了,就要記下剩下的數據,然后重新映射下一塊內存,并將記錄下的剩余數據合并到新讀取的數據中,有點繞?。赡苁俏业南敕ㄌ@了),

下面列出代碼。

procedure TGetDataThread.DoGetData; var  FFile_Handle:THandle;  FFile_Map:THandle;  list:TStringList;  p:PChar;  i,interval:Integer; begin  try  totallen := 0;  offset := 0;  tstream := TMemoryStream.Create;  stream := TMemoryStream.Create;  list := TStringList.Create;  //獲取系統信息  GetSystemInfo(sysinfo);  //頁面分配粒度大小  blocksize := sysinfo.dwAllocationGranularity;  //打開文件  FFile_Handle := CreateFile(PChar(FSourceFileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);  if FFile_Handle = INVALID_HANDLE_VALUE then Exit;  //獲取文件尺寸  filesize := GetFileSize(FFile_Handle,nil);  //創建映射  FFile_Map := CreateFileMapping(FFile_Handle,nil,PAGE_READONLY,0,0,nil);  if FFile_Map = 0 then Exit;  //此處我們已10倍blocksize為一個數據塊來映射,如果文件尺寸小于10倍blocksize,則直接映射整個文件長度  if filesize div blocksize > 10 then   readlen := 10*blocksize  else   readlen := filesize;  for i := 0 to FInfoList.Count - 1 do  begin   list.Delimiter := ':';   list.DelimitedText := FInfoList.Strings[i];   //取得長度,我這里做了解析,因為我存儲的信息為 a:b:c 這種類型,所以以:號分隔   len := StrToInt(list.Strings[1]);   interval := StrToInt(list.Strings[2]);   if (i = 0) or (totallen+len >=readlen) then   begin    //如果已讀取的長度加上即將要讀取的長度大于 10倍blocksize,那么我們要保留之前映射末尾的內容,以便和新映射的內容合并    if i > 0 then    begin     offset := offset + readlen;     //寫入臨時流     tstream.Write(p^,readlen-totallen);     tstream.Position := 0;    end;    //如果未讀取的數據長度已經不夠一個分配粒度,那么就直接映射剩下的長度    if filesize-offset < blocksize then     readlen := filesize-offset;    //映射,p是指向映射區域的指針    //注意這里第三個參數,一直設為0,這個值要根據實際情況設置    p := PChar(MapViewOfFile(FFile_Map,FILE_MAP_READ,0,offset,readlen));   end;   //如果臨時流中有數據,需要合并   if tstream.Size > 0 then   begin    //把臨時流數據copy過來    stream.CopyFrom(tstream,tstream.Size);    //然后在末尾寫入新數據,合并完成    stream.Write(p^,len-tstream.Size);    totallen := len-tstream.Size;    //移動指針的位置,指向下一個數據的開始    Inc(p,len-tstream.Size);    tstream.Clear;   end   else   begin    stream.Write(p^,len);    totallen := totallen + len;    Inc(p,len);   end;   stream.Position := 0;   //將流保存成文件   stream.SaveToFile(IntToStr(i)+'.txt');   stream.Clear;  end;  finally   stream.Free;   tstream.Free;   CloseHandle(FFile_Handle);   CloseHandle(FFile_Map);  end; end; 

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品国产91久久久久久| 国产成人福利夜色影视| 亚洲天堂av综合网| 91久久精品日日躁夜夜躁国产| 国产精品劲爆视频| 亚洲欧美成人一区二区在线电影| 国产精品久久色| 欧美激情三级免费| 日韩av一区二区在线| 国产精品美女久久久久av超清| 国产精品va在线播放我和闺蜜| 欧美成人免费va影院高清| 国产视频精品久久久| 亚洲xxxx视频| 亚洲视频一区二区| 久久天天躁狠狠躁夜夜躁| 国产成人亚洲综合| 高跟丝袜欧美一区| 日韩av手机在线看| www.欧美免费| 日韩av在线免费观看一区| 2019国产精品自在线拍国产不卡| 色婷婷综合久久久久中文字幕1| 中文字幕在线国产精品| 91高清视频免费观看| 一本大道香蕉久在线播放29| 91天堂在线视频| 精品久久久久久久久久久| 日韩av免费在线观看| 色七七影院综合| 国产日韩精品入口| 成人av在线亚洲| yellow中文字幕久久| 亚州欧美日韩中文视频| 久久夜色精品国产| 北条麻妃99精品青青久久| 91高清视频在线免费观看| 亚洲精品国产美女| 91网站免费看| 亚洲美女中文字幕| 精品国产成人在线| 岛国av午夜精品| 亚洲性xxxx| 久久久人成影片一区二区三区| 欧美精品videofree1080p| 97视频免费在线观看| 亚洲xxxx18| 日韩欧亚中文在线| 欧美在线视频a| 成人在线视频福利| 国产精品色悠悠| 午夜精品一区二区三区在线视频| 亚洲乱码国产乱码精品精| 久久韩剧网电视剧| 欧美视频二区36p| 欧美在线中文字幕| 国产欧美一区二区三区在线| 欧美电影院免费观看| 亚洲免费成人av电影| 亚洲成年人在线播放| 国产成人精品视频在线| 久久久噜噜噜久久中文字免| 欧美亚州一区二区三区| 国产精品久久久久久久久免费| 91精品久久久久久久久久另类| 日韩精品一区二区三区第95| 庆余年2免费日韩剧观看大牛| 清纯唯美亚洲激情| 国产精品美女久久久久久免费| 91国语精品自产拍在线观看性色| 欧美又大又粗又长| 久久精品国产2020观看福利| 久久成人18免费网站| 成人淫片在线看| www.日韩.com| 伊人伊成久久人综合网站| 久久久免费精品视频| 91色视频在线观看| 日本午夜精品理论片a级appf发布| 国产日韩在线观看av| 亚洲999一在线观看www| 日韩免费在线免费观看| 欧美日韩人人澡狠狠躁视频| 一级做a爰片久久毛片美女图片| 久热精品视频在线观看| 98午夜经典影视| 97成人在线视频| 91精品国产九九九久久久亚洲| 欧美日韩裸体免费视频| 亚洲国产婷婷香蕉久久久久久| 国产丝袜高跟一区| 国产欧美一区二区三区视频| 久久成人18免费网站| 久久久噜噜噜久久| 国产精品久久久久久久久久免费| 欧美理论电影在线观看| 久久亚洲精品中文字幕冲田杏梨| 亚洲精品资源美女情侣酒店| 日韩精品极品在线观看| 欧美激情极品视频| 亚洲成年人影院在线| 国产精品成人观看视频国产奇米| 欧美精品www在线观看| 国产亚洲福利一区| 国产精品观看在线亚洲人成网| 色综合久久久888| 97香蕉超级碰碰久久免费的优势| 国产美女精品免费电影| 国产精品a久久久久久| 成人黄色av播放免费| 欧美日韩在线观看视频小说| 国产欧美精品一区二区| 色悠悠久久久久| 亚洲精品98久久久久久中文字幕| 日韩免费在线免费观看| 国产精品亚洲视频在线观看| 久久777国产线看观看精品| 日韩暖暖在线视频| 欧美丰满老妇厨房牲生活| 色老头一区二区三区在线观看| 黑人巨大精品欧美一区二区免费| 精品无人区乱码1区2区3区在线| 最近更新的2019中文字幕| 欧美激情国产高清| 国产女人精品视频| 亚洲午夜精品久久久久久久久久久久| 亚洲国产精品va在线看黑人| 亚洲女人初尝黑人巨大| 日韩成人在线视频网站| 色99之美女主播在线视频| 国产一区二区三区四区福利| 在线精品播放av| 亚洲加勒比久久88色综合| 一区二区亚洲精品国产| 国产日韩中文字幕在线| 国产精品久久久久久av福利软件| 精品亚洲一区二区三区| 国产在线精品成人一区二区三区| 亚洲精品一区二区网址| 国产日韩欧美在线| 国产69精品久久久| 韩国国内大量揄拍精品视频| 91成人免费观看网站| 欧美午夜激情在线| 国产精品久久久久91| 粉嫩av一区二区三区免费野| 一夜七次郎国产精品亚洲| 欧美激情精品久久久久久| 亚洲影院高清在线| 国产精品视频白浆免费视频| 日韩精品视频免费在线观看| 亚洲欧美另类中文字幕| 亚洲国产精品va| 最新亚洲国产精品| 久久99国产精品久久久久久久久| 中文字幕久久久av一区| 欧美国产激情18| 久久激情视频免费观看| 日韩午夜在线视频| 国产成人精品亚洲精品| 中文字幕亚洲欧美日韩高清| 69久久夜色精品国产7777| 91欧美精品午夜性色福利在线| 欧美片一区二区三区|