欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
使用文件設備
使用文件設備

    因為文件的使用非常普遍,我將花一些時(shí)間來(lái)專(zhuān)門(mén)討論適用于文件設備的一些要點(diǎn)。本節討論了如何定位文件指針和改變文件大小。

    你必須明白的第一個(gè)要點(diǎn)是Windows被設計為可操作非常大的文件。微軟的設計師們原本就選用了64-bit的數值來(lái)描述一個(gè)文件的大小,而不是32-bit。這就意味著(zhù)一個(gè)文件理論上可達到16EB(exabytes)。

    在一個(gè)32-bit的操作系統上處理64-bit的數值,使得操作文件有點(diǎn)令人不快,因為許多Windows函數要求你以?xún)蓚€(gè)獨立的32-bit數值來(lái)傳遞64-bit參數。不過(guò)你會(huì )發(fā)現,使用這些參數并不是很困難,而且在日常操作中,你不太可能會(huì )使用一個(gè)大于4GB的文件。也就是說(shuō)表示一個(gè)文件大小的 64-bit數值的高32-bit通??偸菫?。


取得文件大小

    當你使用文件時(shí),經(jīng)常需要獲取文件的大小。最簡(jiǎn)單的方法是調用GetFileSizeEx:

BOOL GetFileSizeEx(
   HANDLE         hfile,
   PLARGE_INTEGER pliFileSize);

    第一個(gè)參數hfile是文件的句柄,pliFileSize參數是一個(gè)LARGE_INTEGER聯(lián)合體的地址。LARGE_INTEGER聯(lián)合使得一個(gè) 64-bit數既可以作為兩個(gè)32-bit的數值,也可以作為一個(gè)單獨的64-bit數值來(lái)引用,這在計算文件大小和偏移值時(shí)是相當方便的。這個(gè)聯(lián)合看起來(lái)(基本上)如下所示:

typedef union _LARGE_INTEGER {
   struct {
      DWORD LowPart;    // Low  32-bit unsigned value
      LONG HighPart;    // High 32-bit signed value
   };
   LONGLONG QuadPart;   // Full 64-bit signed value
} LARGE_INTEGER, *PLARGE_INTEGER; 

    除了LARGE_INTEGER外,還有ULARGE_INTEGER聯(lián)合用來(lái)描述一個(gè)無(wú)符號的64-bit數值:

typedef union _ULARGE_INTEGER {
   struct {
      DWORD LowPart;     // Low  32-bit unsigned value
      DWORD HighPart;    // High 32-bit unsigned value
   };
   ULONGLONG QuadPart;   // Full 64-bit unsigned value
} ULARGE_INTEGER, *PULARGE_INTEGER; 

 
    另外一個(gè)很有用的獲取文件大小的函數是GetCompressedFileSize:

DWORD GetCompressedFileSize(
   PCTSTR pszFileName,
   PDWORD pdwFileSizeHigh);

    這個(gè)函數返回文件的物理大小,而GetFileSizeEx返回的是文件的邏輯大小。例如,考慮一個(gè)100-KB的文件被壓縮后占用85 KB空間。調用GetFileSizeEx返回的是文件的邏輯大小100 KB,而GetCompressedFileSize返回的是文件在磁盤(pán)上實(shí)際占用的字節數85 KB。

    與GetFileSizeEx不同的是,GetCompressedFileSize的第一個(gè)參數用一個(gè)文件名作為字符串傳遞而不是使用句柄。 GetCompressedFileSize函數以一種與眾不同的方式返回64-bit的數值:文件大小的低32-bit就是函數的返回值,高32- bit被放置于pdwFileSizeHigh參數指向的DWORD變量中。下面是ULARGE_INTEGER聯(lián)合常見(jiàn)的用法:

ULARGE_INTEGER ulFileSize;
ulFileSize.LowPart = GetCompressedFileSize("SomeFile.dat",
   &ulFileSize.HighPart);
// 64-bit file size is now in ulFileSize.QuadPart 


定位文件指針

    調用CreateFile會(huì )使系統創(chuàng )建一個(gè)文件內核對象來(lái)管理與文件相關(guān)的各種操作。這個(gè)內核對象的內幕是一個(gè)文件指針。文件指針就是一個(gè)文件內的64- bit偏移值,指示下一次同步讀寫(xiě)的位置。開(kāi)始時(shí),文件指針被設為0,所以如果你在調用CreateFile后立即調用ReadFile,你將從文件的偏移0處開(kāi)始讀。如果你從文件讀了10字節到內存,系統會(huì )更新與文件句柄關(guān)聯(lián)的指針,使得下次調用ReadFile時(shí),從文件10字節處開(kāi)始讀。例如,看一下這段代碼,其中文件的開(kāi)始10字節被讀入緩存,接著(zhù)又把隨后的10字節讀入緩存:

BYTE pb[10];
DWORD dwNumBytes;
HANDLE hfile = CreateFile("MyFile.dat", ...); // Pointer set to 0
ReadFile(hfile, pb, 10, &dwNumBytes, NULL);   // Reads bytes  0 - 9
ReadFile(hfile, pb, 10, &dwNumBytes, NULL);   // Reads bytes 10 - 19


    因為每一個(gè)文件內核對象有自己的文件指針,故兩次打開(kāi)同一個(gè)文件會(huì )有稍微不同的結果:

BYTE pb[10];
DWORD dwNumBytes;
HANDLE hfile1 = CreateFile("MyFile.dat", ...); // Pointer set to 0
HANDLE hfile2 = CreateFile("MyFile.dat", ...); // Pointer set to 0
ReadFile(hfile1, pb, 10, &dwNumBytes, NULL);   // Reads bytes 0 - 9
ReadFile(hfile2, pb, 10, &dwNumBytes, NULL);   // Reads bytes 0 - 9


    在這個(gè)例子中,兩個(gè)不同的內核對象管理同一個(gè)文件。由于每個(gè)內核對象都有自己的文件指針,用一個(gè)文件對象操作文件時(shí)不會(huì )影響另一個(gè)對象維護的文件指針,故文件開(kāi)始處的10字節會(huì )被讀兩次。

    我想多舉一個(gè)例子以使得這些內容更清晰:

BYTE pb[10];
DWORD dwNumBytes;
HANDLE hfile1 = CreateFile("MyFile.dat", ...); // Pointer set to 0
HANDLE hfile2;
DuplicateHandle(
   GetCurrentProcess(), hfile1, 
   GetCurrentProcess(), &hfile2,
   0, FALSE, DUPLICATE_SAME_ACCESS);
ReadFile(hfile1, pb, 10, &dwNumBytes, NULL);   // Reads bytes  0 - 9
ReadFile(hfile2, pb, 10, &dwNumBytes, NULL);   // Reads bytes 10 - 19


     在這個(gè)例子中,一個(gè)文件內核對象被兩個(gè)文件句柄引用。不管用哪一個(gè)句柄操作文件,都只有一個(gè)文件指針被更新。和上個(gè)例子一樣,每次都讀出不同的字節。

    如果你需要隨機訪(fǎng)問(wèn)一個(gè)文件,你就需要改變與文件內核對象相關(guān)聯(lián)的文件指針。調用SetFilePointerEx可以做到這一點(diǎn):

BOOL SetFilePointerEx(
   HANDLE         hfile,
   LARGE_INTEGER  liDistanceToMove,
   PLARGE_INTEGER pliNewFilePointer,
   DWORD          dwMoveMethod); 


 
    hfile參數指示你想改變其文件指針的文件內核對象。iDistanceToMove參數告訴系統你想移動(dòng)指針多少個(gè)字節。你指定的數字是增加到文件指針的當前值,所以一個(gè)負數將引起文件指針的倒退。SetFilePointerEx的最后一個(gè)參數,dwMoveMethod,告訴 SetFilePointerEx如何解釋liDistanceToMove參數。表 2-8 描述了你可以傳遞給dwMoveMethod的三個(gè)不同值以指定移動(dòng)的起始點(diǎn)。


表 2-8.可傳遞給SetFilePointerEx的dwMoveMethod參數的值
參數值   含義
FILE_BEGIN  文件對象的文件指針被設為liDistanceToMove參數給出的值。注意liDistanceToMove被當成一個(gè)無(wú)符號的64-bit值。
FILE_CURRENT  文件對象的文件指針的值被加上liDistanceToMove。注意liDistanceToMove被當成一個(gè)有符號的64-bit值,你可以在文件中向后移動(dòng)指針。
FILE_END  文件對象的文件指針被設為文件邏輯大小加上liDistanceToMove的值。注意liDistanceToMove被當成一個(gè)有符號的64-bit值,你可以在文件中向后移動(dòng)指針。


    在SetFilePointerEx更新文件對象的文件指針后,文件指針的新值被返回到由pliNewFilePointer參數指向的LARGE_INTEGER。如果你對新指針值不感興趣,可以傳遞NULL給pliNewFilePointer。

    關(guān)于SetFilePointerEx這里給出一些要注意的要點(diǎn):

    ■  設置文件指針越過(guò)文件的當前長(cháng)度末尾是合法的。這樣做并不會(huì )實(shí)際增加文件在磁盤(pán)上的大小,除非你在這個(gè)位置寫(xiě)文件或調用SetEndOfFile。

    ■  對由FILE_FLAG_NO_BUFFERING標志打開(kāi)的文件使用SetFilePointerEx時(shí),文件指針只能被定位于對齊扇區的邊界處。本章后面的FileCopy示例程序演示了如何正確使用這種方式。

    ■  Windows沒(méi)有提供一個(gè)GetFilePointerEx函數,但是你可以使用SetFilePointerEx來(lái)獲得期望的效果:

   LARGE_INTEGER liCurrentPosition = { 0 };
   SetFilePointerEx(hfile, liCurrentPosition, &liCurrentPosition, 
      FILE_CURRENT);



 
設置文件尾
 
    通常,系統在文件關(guān)閉時(shí)負責設置文件尾。不過(guò),你可能有時(shí)想要使一個(gè)文件變大或變小。在這些情況下,調用

BOOL SetEndOfFile(HANDLE hfile);



    SetEndOfFile截斷或延伸一個(gè)文件的末尾到文件對象的指針所指示的位置。例如,如果你想強制一個(gè)文件為1024字節長(cháng),你可以這樣使用SetEndOfFile:

HANDLE hfile = CreateFile(...);
LARGE_INTEGER liDistanceToMove;
liDistanceToMove.QuadPart = 1024;
SetFilePointerEx(hfile, liDistanceToMove, NULL, FILE_BEGIN);
SetEndOfFile(hfile);
CloseHandle(hfile);


 
    用Windows Explorer查看該文件的屬性,你會(huì )看到文件正好是1024字節長(cháng)。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
深入理解ZwCreateFile
vb中保存文本為Unicode編碼的txt文件
Windows核心編程(第五版)筆記 第十章 同步和異步設備I/O(Synchronous...
Windows API一日一練(54)WriteFile和ReadFile函數
OVERLAPPED 與 FILE
將應用程序從 OS/2 遷移到 Linux 上: 第 2 部分,內存管理、IPC 和文件處...
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久