调用WinApi实现超大文件分割

不多说了,10G+的Sql测试分割成功,每块大小不要超过1G就好了。

//Code by Pnig0s1992
//Date:2012,3,18
#include <stdio.h>
#include <Windows.h>  

#define MAXLENGTH 30  

int main(int argc,char * argv[])
{
    LPTSTR lpFileName = "xxx.sql";
    HANDLE hFile;
    struct FILEINFO
    {
        LONGLONG llFileSize;
        LONG llPartSize;
        DWORD dwPartNum;
    };  

    FILEINFO fi;
    fi.llFileSize = 0;
    fi.llPartSize = 0;
    fi.dwPartNum = 0;
    fi.llPartSize = 1024*1024;
    hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        printf("\n获得文件句柄失败%d。",GetLastError());
        return -1;
    }  

    LARGE_INTEGER uli = {0};
    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    DWORD dwGran = SysInfo.dwAllocationGranularity;  

    LONGLONG qwFileOffset = 0;
    LONGLONG dwBlockBytes = fi.llPartSize;
    if(GetFileSizeEx(hFile,&uli))
    {
        fi.llFileSize = uli.QuadPart;
        fi.dwPartNum = fi.llFileSize/dwBlockBytes;
        if((fi.llFileSize%dwBlockBytes) != 0)
        {
            fi.dwPartNum+=1;
        }
        printf("\n文件:%s 大小为:%I64d KB",lpFileName,uli.QuadPart/1024);
        printf("\n分块大小:%u KB 分块数:%u",(dwBlockBytes/1024),fi.dwPartNum);
    }  

    HANDLE hFileMap;
    hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);//超大文件时该处失败
    if(hFileMap == NULL)
    {
        printf("\n创建文件映射对象句柄失败:%d。",GetLastError());
        CloseHandle(hFile);
        return -1;
    }  

    LPSTR sTempStr = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAXLENGTH);
    for(int index = 0;index<fi.dwPartNum;index++)
    {
        LPVOID lpMapStartPos;
        if(fi.llFileSize < dwBlockBytes)
        {
            dwBlockBytes = fi.llFileSize;
        }
        lpMapStartPos = MapViewOfFile(hFileMap,FILE_MAP_READ,0,qwFileOffset,dwBlockBytes);
        if(lpMapStartPos == NULL)
        {
            printf("\n映射目标文件到内存失败:%d。",GetLastError());
            CloseHandle(hFileMap);
            CloseHandle(hFile);
            return -1;
        }
        qwFileOffset += dwBlockBytes;
        fi.llFileSize  -=  dwBlockBytes;  

        sprintf(sTempStr,"%s_%d",lpFileName,index+1);
        HANDLE hNewFile = CreateFile(sTempStr,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        if(hNewFile == INVALID_HANDLE_VALUE)
        {
            printf("\n获取分块文件对象句柄失败:%d。",GetLastError());
            UnmapViewOfFile(lpMapStartPos);
            CloseHandle(hFileMap);
            CloseHandle(hFile);
            return -1;
        }
        HANDLE hNewFileMap;
        hNewFileMap = CreateFileMapping(hNewFile,NULL,PAGE_READWRITE,0,dwBlockBytes,NULL);
        if(hNewFile == NULL)
        {
            printf("\n获取分块文件内存映射对象句柄失败:%d。",GetLastError());
            UnmapViewOfFile(lpMapStartPos);
            CloseHandle(hNewFile);
            CloseHandle(hFileMap);
            CloseHandle(hFile);
            return -1;
        }
        LPVOID lpNewFilePos = MapViewOfFile(hNewFileMap,FILE_MAP_WRITE,0,0,0);
        if(lpNewFilePos == NULL)
        {
            printf("\n映射分块文件到内存失败:%d。",GetLastError());
            UnmapViewOfFile(lpMapStartPos);
            CloseHandle(hNewFileMap);
            CloseHandle(hNewFile);
            CloseHandle(hFileMap);
            CloseHandle(hFile);
            return -1;
        }  

        CopyMemory(lpNewFilePos,lpMapStartPos,dwBlockBytes);
        printf("\n分块文件%s成功生成。",sTempStr);
        CloseHandle(hNewFileMap);
        CloseHandle(hNewFile);
        UnmapViewOfFile(lpMapStartPos);
        UnmapViewOfFile(lpNewFilePos);  

    }  

    CloseHandle(hFileMap);
    CloseHandle(hFile);
    system("pause");
    return 0;
}

本文出自 “About:Blank H4cking” 博客,请务必保留此出处http://pnig0s1992.blog.51cto.com/393390/809886

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, printf
, 句柄
, 超大数
, 超大文件
LONGLONG
超大文件分割器、超大txt文件分割、超大文本文件分割、超大文本分割器、超大文本文件分割器,以便于您获取更多的相关知识。

时间: 2024-08-30 17:55:59

调用WinApi实现超大文件分割的相关文章

WinRAR如何分割超大文件

  在自己的硬盘上有一个比较大的文件,想把它从网上通过E-Mail发送给朋友时,却发现对方的收信服务器不能够支持那么大的文件--,这时即使用ZIP等压缩软件也无济于事,因为该文件本身已经被压缩过了.于是许多人都去寻找文件分割的软件,其实根本无需那么麻烦,使用WinRAR就可以了. 通过本文,你可以把一些大的文件压缩成多个小文件,享受压缩.分割文件一气呵成的服务. 第一步:选中压缩文件 按下Win+E键启动"资源管理器",再选中欲压缩的文件或文件夹(可以配合Ctrl和Shift键多选),

超大文件上传(10G)

问题描述 最近在做javaweb的超大文件上传,基本要实现10G以上的文件的需求,本人初学,请各位大侠指点一二. 解决方案 解决方案二:commons-upload解决方案三:jspsmart.jarcommons-fileupload-1.2.2.jar类publicclassUploadServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsSe

Asp.Net超大文件上传问题解决_实用技巧

  最近涉及到用asp.net做上传功能的一个问题,因为asp.net有fileupload的上传控件,但是这个控件上传的文件大小有限,所以根本满足不了需求百度了下,很多人遇到asp.net上传超大文件的困惑,偶尔搜索发现csdn有个哥们提到这个超大文件如何实现,RadUpload.Net2.dll并且提供了这个动态库进行处理超大文件的上传处理过程.于是就下载下来看了看,果然效果不错,不但支持吵过700M的文件上传快速,更重要的是支持多线程的上传文件.查看源代码发现利用的控件也是fileuplo

asp.net超大文件上传方法

asp教程.net超大文件上传方法 asp.net教程大文件上传是一个不完善和有缺陷的领域,相信在不久会得到提高和发展,如果你已经解决了,说明你在一个好公司,否则你可以考虑使用第三方产品来解决了.文件上传的问题,我们都能够找到很多种不同的方法来解决,挑战在于找出不同做法的利弊然后找到一个适用于自己项目的方案,这不仅仅是在文件上传这一个方面!   <asp:image id="imglogo" runat="server" /><br/> &l

线程-java调用sqlplus下载数据库文件到本地后,如果用java关闭此进程,大神戳进来

问题描述 java调用sqlplus下载数据库文件到本地后,如果用java关闭此进程,大神戳进来 1.用java调用sqlplus,将指定的存储过程下载到本地作为文本文件2.在java读取此本地文件做处理,处理后写1个新的文本文件在本地我将上面2个步骤用2个进程thread1,thread2因为步骤2必须等步骤1结束才能执行,所以我调用thread1.start()thread1.join()以及thread2.start().但是运行结果是每次都只执行出了步骤1,步骤2执行不出来.考虑是否在步

根据分辨率不同调用不同的css文件

css|分辨率 根据分辨率不同,调用不同的CSS文件根据分辨率不同,调用不同的css文件 dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0> 

该文件可以包含在任何需要调用数据库的ASP文件头部,直接过虑掉非法注入

数据|数据库 <%'该文件可以包含在任何需要调用数据库的ASP文件头部,直接过虑掉非法注入'调用方法为:<!-- #include file="safe.asp" -->Function Safe(str)'该函数用来判断传递过来的变量是否包含特殊字符,没有返回TRUE Dim s_BadStr, n, i s_BadStr = "' &<>?%,;:()`~!@#$^*{}[]|\/+-="&Chr(34)&C

将调用多个swf文件的flash合成一个EXE文件

前些天看到有朋友在许多论坛问同样一个问题-- 多SWF打包发布成EXE问题?多SWF打包发布成EXE问题? 做一个FLASH中有 index.swf 1.swf 2.swf 3.swf 4.swf 5.swf 6.swf 7.swf 8.swf 9.swf 这样10个SWF文件 其中index.swf 有调用 其它的SWF文件.. 我想把他们发布成一个 EXE 文件请问我应该怎么做? 我想要的最终效果是.10个swf打包成一个 .exe 文件.能正常调用执行. 这种功能用flash是不好做的,当

用C#设计一个命令行方式的文件分割器

命令行|设计 共享软件中有很多界面美观的文件分割程序,将一个大文件分割成几个较小的文件,分别保存,需要的时候再合并成原来的文件,常常是必备的工具. 本文用微软的visual studio .net开发环境的C#语言也来设计一个文件分割器,并且以DOS命令行方式运行,就象使用copy命令一样简单.从中也可以了解文件分割的原理以及.net框架对文件的读写操作方式. 新建一个visual c#项目,选择"控制台应用程序",项目名称设置为filesplitcon,系统自动产生了class1.c