稀疏提交的記憶體對映檔案

2021-08-14 11:02:29 字數 2414 閱讀 1193

那麼有沒有儲存器來自於磁碟檔案的類似的用法呢,有(要不然就白講了)

nt檔案系統(ntfs)提供了對稀疏檔案的支援,看下什麼是ntfs吧

如果是這種檔案系統就支援稀疏檔案

下面我們講講怎麼用吧

1.我們要用系統函式檢查是否支援稀疏檔案

memset(g_volume, 0, max_path);

getcurrentdirectory(max_path,g_szpath);

strncpy_s(g_volume, g_szpath, 3);

dword dwfilesystemflags = 0;

bool bok=getvolumeinformation(g_volume, null, 0, null, null, &dwfilesystemflags, null, 0);//獲取磁碟資訊

bok = bok && (dwfilesystemflags&file_supports_sparse_files);//dwfilesystemflags&file_supports_sparse_files檢視標誌位判斷對稀疏檔案的支援

2.建立檔案,這次使用createfile函式(過於簡單我就不說了)

3.使用deviceioc

dword dw;

bool ret = deviceiocontrol(hfile, fsctl_set_sparse, null, 0, null, 0, &dw, null);//fsctl_set_sparse設定接下來建立的記憶體對映檔案為稀疏檔案

使用完了之後,進行一系列的清除操作

這次貼上完整的**

#include 

#include

#include

#include

using

namespace

std;

#define fl (1024*1024)

#define fh 0

char g_szpath[max_path];

char g_volume[max_path];

//(3797960)

int main()

dword dw;

string filename = "mmf";

handle hfile = createfile(filename.c_str(), generic_read | generic_write, 0, null, create_always, file_attribute_normal, null);

int err = getlasterror();

if (hfile == invalid_handle_value)

//bool ret=deviceiocontrol(hfile,fsctl_set_sparse,null,0,null,0,&dw,null);

bool ret = deviceiocontrol(hfile, fsctl_set_sparse, null, 0, null, 0, &dw, null);//設定稀疏檔案

err = getlasterror();

if (!ret)

unmapviewoffile(pfile);

closehandle(hfile);

system("pause");

return

0;}

建立好的檔案時這樣子的

雖然可以容納的位元組數為1mb,但是由於並沒有分配記憶體,所以,實際大小只有4kb

我們來看看為什麼大小為4kb,而不是0kb

檔案在磁碟上所佔的空間不是已byte來衡量 的,而是以簇來衡量的

扇區是磁碟最小的物理儲存單元,但由於作業系統無法對數目眾多的扇區進行定址,所以作業系統就將相鄰的扇區組合在一起,形成乙個簇,然後再對簇進行管理

作業系統規定乙個簇中只能放置乙個檔案的內容,因此檔案實際所占用的物理空間大小,只能是簇的整數倍;而如果檔案實際大小小於一簇,它也要佔一簇的空間

也就是說簇是檔案存放的基本單位,那麼一簇是多少位元組呢

可以看出,這就是占用4kb的原因

另外對於稀疏檔案,哪怕你只對其中的乙個位元組賦值,系統就會提交分配粒度(64kb)大小的區域到儲存器

記憶體對映檔案

記憶體對映檔案是利用虛擬記憶體把檔案對映到程序的位址空間中去,在此之後程序操作文 件,就像操作程序空間裡的位址一樣了,比如使用 memcpy 等記憶體操作的函式。這種方法能 夠很好的應用在需要頻繁處理乙個檔案或者是乙個大檔案的場合,這種方式處理 io效率比 普通 io效率要高。另外,unix 把它做...

記憶體對映檔案

記憶體對映檔案有三種,第一種是可執行檔案的對映,第二種是資料檔案的對映,第三種是借助頁面交換檔案的記憶體對映.應用程式本身可以使用後兩種記憶體對映.1.可執行檔案對映 windows在執行乙個win32應用程式時使用的是記憶體對映檔案技術.系統先在程序位址空間的0x00400000以上保留乙個足夠大...

記憶體檔案對映

一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一一對應...