一、使用內存映射文件:
CreateFileMapping的參數可以設置最大長度,當實際文件的長度小于設置的最大長度時,系統自動擴展。注意:在CreateFile的時候要加寫權限。
HANDLE hFile;
HANDLE hMapFile;
hFile = CreateFile(
"D:\\LargeFile.dat",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hFile == INVALID_HANDLE_VALUE )
{
printf( "create file failed.\n" );
return;
}
hMapFile = CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE,
0,
2*1024*1024, // 2 MByte
NULL
);
if( hMapFile == NULL )
{
printf( "create file mapping failed.\n" );
CloseHandle( hFile );
return;
}
printf( "OK!\n" );
CloseHandle( hMapFile );
CloseHandle( hFile );
二、設置文件指針 + 設置EOF
兩個API完成,首先調用SetFilePointer,在參數里填入所需的長度,再調用SetEndOfFile,完成。
HANDLE hFile;
hFile = CreateFile(
"D:\\LargeFile1.dat",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hFile == INVALID_HANDLE_VALUE )
{
printf( "create file failed.\n" );
return;
}
SetFilePointer(
hFile,
2*1024*1024,
NULL,
FILE_BEGIN
);
SetEndOfFile( hFile );
printf( "OK!\n" );
CloseHandle( hFile );
三、設置文件指針 + 寫1Byte
也是兩個API完成,首先調用SetFilePointer,再調用WriteFile寫入1byte就完成了。
HANDLE hFile;
DWORD dwR;
hFile = CreateFile(
"D:\\LargeFile2.dat",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hFile == INVALID_HANDLE_VALUE )
{
printf( "create file failed.\n" );
return;
}
SetFilePointer(
hFile,
2*1024*1024 - 1,
NULL,
FILE_BEGIN
);
WriteFile(
hFile,
"A",
1,
&dwR,
NULL
);
printf( "OK!\n" );
CloseHandle( hFile );
順便說一下,第三種方法是FlashGet使用的方法。第一種方法只發一個IRP,速度最快,第二種要發兩個IRP,第三種也是發兩個IRP,不過還有一個寫動作,速度略慢。
補充一點:磁盤格式是FAT32的文件系統會真正的寫數據,格式是NTFS的文件系統則沒有寫數據,故速度很快。