#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. CSS样式适配杂记

    1.问:input框的对齐,制作类似百度搜索框的时候,发现IE下前面输入框和后面按钮总是不能对齐. 解答:给input框增加vertical-align:bottom; 2.问:IE下display: ...

  2. [Swift通天遁地]八、媒体与动画-(10)在项目中播放GIF动画

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

  3. [Swift通天遁地]九、拔剑吧-(12)创建Preview-Transition图像预览界面

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

  4. JSP执行原理图

  5. 316 Remove Duplicate Letters 去除重复字母

    给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果.例如:给定 "bcabc"返回 "a ...

  6. P3368 【模板】树状数组 2(树状数组维护差分序列)

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  7. bindColumn、bindParam与bindValue的区别

    bindColumn:绑定一列到一个 PHP 变量(类似于list()函数为变量赋值) <?php //连接数据库函数 functionconnect() { try { $dbh = new ...

  8. mongo3.4 配置文件 注意事项

    给mongo配置文件坑了好久,今天终于解决了.写个博客,庆祝一下. mongo3.4 版本,我是用YAML格式的配置文件. 一开始,配置之后,启动服务的时候,老是提示:“unrecognized op ...

  9. 用nginx实现分布式限流

    1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可 ...

  10. 【sqli-labs】 less46 GET -Error based -Numeric -Order By Clause(GET型基于错误的数字型Order By从句注入)

    http://192.168.136.128/sqli-labs-master/Less-46/?sort=1 sort=4时出现报错 说明参数是添加在order by 之后 错误信息没有屏蔽,直接使 ...