一、使用內(nèi)存映射文件:
CreateFileMapping的參數(shù)可以設(shè)置最大長度,當(dāng)實(shí)際文件的長度小于設(shè)置的最大長度時(shí),系統(tǒng)自動(dòng)擴(kuò)展。注意:在CreateFile的時(shí)候要加寫權(quán)限。
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 );
二、設(shè)置文件指針 + 設(shè)置EOF
兩個(gè)API完成,首先調(diào)用SetFilePointer,在參數(shù)里填入所需的長度,再調(diào)用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 );
三、設(shè)置文件指針 + 寫1Byte
也是兩個(gè)API完成,首先調(diào)用SetFilePointer,再調(diào)用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使用的方法。第一種方法只發(fā)一個(gè)IRP,速度最快,第二種要發(fā)兩個(gè)IRP,第三種也是發(fā)兩個(gè)IRP,不過還有一個(gè)寫動(dòng)作,速度略慢。
補(bǔ)充一點(diǎn):磁盤格式是FAT32的文件系統(tǒng)會真正的寫數(shù)據(jù),格式是NTFS的文件系統(tǒng)則沒有寫數(shù)據(jù),故速度很快。