大龙的博客

常用链接

统计

最新评论

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的文件系统则没有写数据,故速度很快。

posted on 2008-04-27 14:10 大龙 阅读(3279) 评论(1)  编辑 收藏 引用

评论

# re: Windows快速创建大文件的三种方法(转) 2008-08-07 03:00 hcm

请教:

磁盘格式是FAT32的文件系统会真正的写数据,格式是NTFS的文件系统则没有写数据,故速度很快。

我以为都是真正写数据。(我初学C++ ,好多不会的。)

创建文件,为什么还有假写数据呢?  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理