Windows快速创建大文件的三种方法

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,不过还有一个写动作,速度略
补充一点:磁盘格式是FAT32的文件系统会真正的写数据,格式是NTFS的文件系统则没有写数据,故速度很快。

你可能感兴趣的:(Windows快速创建大文件的三种方法)