windows 快速创建大文件

一、使用内存映射文件:
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,不过还有一个写动作,速度略慢。

你可能感兴趣的:(windows)