一、使用内存映射文件: 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的文件系统则没有写数据,故速度很快。
|