#include <Windows.h>
#include <vector>
#include <string>
using namespace std;

//推断文件是否存在
bool FileExistsW(const wstring &fn)
{
WIN32_FIND_DATAW fd;
HANDLE hFile = FindFirstFileW(fn.c_str(),&fd);
if (hFile != INVALID_HANDLE_VALUE)
{
::FindClose(hFile);
return true;
}
return false;
} //推断文件夹是否存在
bool DirectoryExistsW(const wstring &fn)
{
// return PathFileExistsA(fn.c_str());
DWORD Code = GetFileAttributesW(fn.c_str());
return (Code != INVALID_FILE_ATTRIBUTES) && ((FILE_ATTRIBUTE_DIRECTORY & Code) != 0);
} //文件夹+反斜杠
wstring IncludeTrailingPathDelimiterW(const wstring &path)
{
wstring s = path;
if (s.empty())
return s;
if (s[s.length()-1] != L'\\')
return s+L"\\";
else
return s;
} //获取路径的文件名称
wstring ExtractFileNameW(const wstring &filestr)
{
if (filestr.empty())
return L"";
for(int i = filestr.length()-1; i>=0; --i)
{
if (filestr[i] == L'\\')
{
return filestr.substr(i+1);
}
}
return L"";
} std::wstring IntToStrW( const int i )
{
wchar_t buf[16]={0};
_itow_s(i,buf,10);
return wstring(buf);
} inline void IncPtr(void **p,int i)
{
*p = (void*)((int)*p + i);
}
//切割文件
bool BreakFile(const wchar_t *fn,unsigned long block_size,const wchar_t *save_path)
{
if(!FileExistsW(fn))
return false;
if(!DirectoryExistsW(save_path))
return false;
if(block_size < 1)
return false;
HANDLE hf = CreateFileW(fn,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(INVALID_HANDLE_VALUE == hf)
return false;
int iblock = 1;
wstring fblock = IncludeTrailingPathDelimiterW(save_path)+ExtractFileNameW(fn)+L".part"+IntToStrW(iblock);
HANDLE hfw = CreateFileW(fblock.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);
if(INVALID_HANDLE_VALUE == hfw)
{
CloseHandle(hf);
return false;
}
DWORD dwWrited = 0,dwWritedTemp = 0;
DWORD dwToWrite = 0;
DWORD dwRemain = 0;
unsigned char buf[8192];
DWORD dwReaded = 0;
int iseek = 0;
void *p = NULL;
while(true)
{
dwReaded = 0;
if(FALSE == ReadFile(hf,buf,sizeof(buf),&dwReaded,NULL))
break;
if(0 == dwReaded)
break;
iseek = 0;
p = (void*)buf;
dwRemain = dwReaded; label_rewrite:
if(dwWrited >= block_size)
{
::CloseHandle(hfw);
++iblock;
fblock = IncludeTrailingPathDelimiterW(save_path)+ ExtractFileNameW(fn)+L".part"+IntToStrW(iblock);
hfw = CreateFileW(fblock.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);
if(INVALID_HANDLE_VALUE == hfw)
{
CloseHandle(hf);
return false;
}
dwWrited = 0;
}
IncPtr(&p,iseek);
dwToWrite = min(dwRemain,block_size - dwWrited);
dwWritedTemp = 0;
if(FALSE == WriteFile(hfw,p,dwToWrite,&dwWritedTemp,NULL))
break;
dwWrited += dwWritedTemp;
if(dwRemain > dwWritedTemp)
dwRemain = dwRemain - dwWritedTemp;
else
dwRemain = 0;
iseek = dwWritedTemp;
if(dwRemain > 0)
goto label_rewrite; dwReaded = 0;
} ::CloseHandle(hfw);
::CloseHandle(hf); return true; } //合并文件
bool CombineFiles(const vector<wstring> &files,const wstring &destfile)
{
if(FileExistsW(destfile))
return false;
if(files.empty())
return false;
HANDLE hf = CreateFileW(destfile.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);
if(INVALID_HANDLE_VALUE == hf)
return false;
HANDLE hfr = INVALID_HANDLE_VALUE;
unsigned char buf[8192];
DWORD dwReaded = 0,dwToWrite = 0,dwWrited = 0,dwRemain = 0,dwWritedTemp = 0;
LONGLONG dwFileSize = 0,dwDestSize = 0;
LARGE_INTEGER li;
void *p=NULL;
int iseek = 0;
for(size_t i = 0; i<files.size(); ++i)
{
if(!FileExistsW(files[i]))
continue;
hfr = CreateFileW(files[i].c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(INVALID_HANDLE_VALUE == hfr)
continue; li.QuadPart = 0;
if(FALSE == GetFileSizeEx(hfr,&li))
{
CloseHandle(hf);
return false;
}
dwDestSize += li.QuadPart;
}
li.QuadPart = dwDestSize;
if(FALSE == SetFilePointerEx(hf,li,NULL,FILE_BEGIN))
{
CloseHandle(hf);
return false;
}
if(FALSE == SetEndOfFile(hf))
{
CloseHandle(hf);
return false;
}
CloseHandle(hf);
hf = CreateFileW(destfile.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(INVALID_HANDLE_VALUE == hf)
{
hf = 0;
return false;
} hfr = INVALID_HANDLE_VALUE;
for(size_t i = 0; i<files.size(); ++i)
{
if(!FileExistsW(files[i]))
continue;
if(INVALID_HANDLE_VALUE != hfr)
CloseHandle(hfr);
hfr = CreateFileW(files[i].c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(INVALID_HANDLE_VALUE == hfr)
continue; label_read:
dwReaded = 0;
if(FALSE == ReadFile(hfr,buf,sizeof(buf),&dwReaded,NULL))
continue;
if (dwReaded == 0)
continue;
iseek = 0;
p = (void*)buf;
dwRemain = dwReaded; label_rewrite:
IncPtr(&p,iseek);
dwToWrite = dwRemain;
dwWritedTemp = 0;
if(FALSE == WriteFile(hf,p,dwToWrite,&dwWritedTemp,NULL))
continue;
dwWrited += dwWritedTemp;
if(dwRemain > dwWritedTemp)
dwRemain = dwRemain = dwWritedTemp;
else
dwRemain = 0;
iseek = dwWritedTemp;
if(dwRemain>0)
goto label_rewrite;
goto label_read;
}
if(INVALID_HANDLE_VALUE!=hfr)
CloseHandle(hfr);
CloseHandle(hf);
return true;
}

源代码:windows文件切割与合并的更多相关文章

  1. Java---练习:文件切割与合并(1)

    实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 示例程序说明: 文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过 ...

  2. IO流_文件切割与合并(带配置信息)

    在切割文件的时候应该生成一个记录文件信息的文件,以便在以后合并文件的时候知道这个文件原来的文件名和记录文件切割完后生成了多少个切割文件 import java.io.File; import java ...

  3. Centos大文件切割和合并

    现在很多公司都会把项目放在云服务器上,当我想把云服务器里面的代码和生成的文件 “sz 文件名称” down下来的时候,发现太大.云服务器不支持下载很大的文件.那么这种情况就需要使用split命令切割文 ...

  4. IO流_文件切割与合并

    切割可以分两种方式:按文件个数切,按文件大小来切(建议用这种方式,因为按个数的话,有可能文件非常大) import java.io.File; import java.io.FileInputStre ...

  5. Java---文件的切割与合并,已经实现图形界面(工具)

    实现对任意文件的切割,实现对切割后的文件的合并. 上次只写了特定目录下的文件切割与合并,有点遗憾, 这次,我写了一个图形界面来实现对文件的切割与合并. 文件切割: 用户可以自己选择需要切割的文件, 软 ...

  6. Windows文件夹、文件源代码对比工具--WinMerge

    /********************************************************************** * Windows文件夹.文件源代码对比工具--WinM ...

  7. IO综合练习--文件切割和文件合并

    有时候一个视频文件或系统文件太大了,上传和下载可能会受到限制,这时可以用文件切割器把文件按大小切分为文件碎片, 等到要使用这个文件了,再把文件碎片合并成原来的文件即可.下面的代码实现了文件切割和文件合 ...

  8. jni 文件切割合并

    最近学习c++,看到很多常用的例子,比如文件切割,切割后后缀可以自定义,别人就无法从表面的一个文件看出是什么,也无法查看到原文件信息,只有合并后才能识别这庐山真面目 实现也比较粗暴,首先在应用层定义好 ...

  9. java下io文件切割合并功能加配置文件

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

随机推荐

  1. [Swift通天遁地]七、数据与安全-(8)创建普通PDF文档和加密PDF文档

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. flask 中的模板语法 jinja2及render_template的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  3. Application、Activity Stack 和 Task的区别

    Application类 Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系 ...

  4. css3 画小蜜蜂

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. json 新用

    如果使用struts2的action,可以省去属性赋值的工夫. 但是假如你没有使用struts2,而且使用的是ajax请求,通过json来传递参数.那我下面所说的对你可能是一个很好的解脱,从此告别re ...

  6. Nginx+nagios安装配置

    Nginx+nagios安装配置 [root@Nagios ~]# vi /etc/nginx/nginx.conf server { listen ; server_name localhost; ...

  7. spark的体系结构

    spark的体系结构 1.客户端(Driver Program) 需要构建一个对象,核心是sc(SparkContext) 以应用程序为例:链接本地 //new conf val conf=new S ...

  8. cocos creator destroy方法

    node.destroy(),Node.destroyAllChildren并不会立即销毁,实际销毁操作会延迟到当前帧渲染前执行. 这段话可能不明白,但是在Node.destroyAllChildre ...

  9. linux中集群的免秘钥SSH直接登录

    这里以三台mysql的主从服务器为例:manage.master.slave1.slave2   给4个机器生成秘钥文件 以manage为例,执行命令,生成空字符串的秘钥(后面要使用公钥),命令是: ...

  10. linux中快速查找文件

    在使用linux时,经常需要进行文件查找.其中查找的命令主要有find和grep.两个命令是有区的. 区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访 ...