源代码:windows文件切割与合并
#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文件切割与合并的更多相关文章
- Java---练习:文件切割与合并(1)
实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 示例程序说明: 文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过 ...
- IO流_文件切割与合并(带配置信息)
在切割文件的时候应该生成一个记录文件信息的文件,以便在以后合并文件的时候知道这个文件原来的文件名和记录文件切割完后生成了多少个切割文件 import java.io.File; import java ...
- Centos大文件切割和合并
现在很多公司都会把项目放在云服务器上,当我想把云服务器里面的代码和生成的文件 “sz 文件名称” down下来的时候,发现太大.云服务器不支持下载很大的文件.那么这种情况就需要使用split命令切割文 ...
- IO流_文件切割与合并
切割可以分两种方式:按文件个数切,按文件大小来切(建议用这种方式,因为按个数的话,有可能文件非常大) import java.io.File; import java.io.FileInputStre ...
- Java---文件的切割与合并,已经实现图形界面(工具)
实现对任意文件的切割,实现对切割后的文件的合并. 上次只写了特定目录下的文件切割与合并,有点遗憾, 这次,我写了一个图形界面来实现对文件的切割与合并. 文件切割: 用户可以自己选择需要切割的文件, 软 ...
- Windows文件夹、文件源代码对比工具--WinMerge
/********************************************************************** * Windows文件夹.文件源代码对比工具--WinM ...
- IO综合练习--文件切割和文件合并
有时候一个视频文件或系统文件太大了,上传和下载可能会受到限制,这时可以用文件切割器把文件按大小切分为文件碎片, 等到要使用这个文件了,再把文件碎片合并成原来的文件即可.下面的代码实现了文件切割和文件合 ...
- jni 文件切割合并
最近学习c++,看到很多常用的例子,比如文件切割,切割后后缀可以自定义,别人就无法从表面的一个文件看出是什么,也无法查看到原文件信息,只有合并后才能识别这庐山真面目 实现也比较粗暴,首先在应用层定义好 ...
- java下io文件切割合并功能加配置文件
package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...
随机推荐
- linux 查看 cpu
如何获得CPU的详细信息: linux命令:cat /proc/cpuinfo 用命令判断几个物理CPU,几个核等: 逻辑CPU个数:# cat /proc/cpuinfo | grep " ...
- EF 新增数据时提示it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element
it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionM ...
- NHibernate学习(零)-本次学习遇到的错误汇总
问题一: "System.TypeInitializationException"类型的未经处理的异常在 KimismeDemo.exe 中发生 其他信息: "NHibe ...
- Python之IPython开发实践
Python之IPython开发实践 1. IPython有行号. 2. Tab键自动完成,当前命名空间任何与已输入字符串相匹配的变量就会被找出来. 3. 内省机制,在变量前或者后面加上(?)问号,就 ...
- 移动web——bootstrap模板
基本概念 1.bootstrap就是在媒体查询技术出现以后才开始出现的 2.此技术使响应式开发变得十分轻松,最大特点就是栅格系统(什么设备上如何显示)以及响应式工具(是否可见) 基本模板 <!D ...
- Redis系列(一)StackExchange.Redis的使用
Redis系列(一)StackExchange.Redis的使用 一.DLL安装 用NuGet搜索StackExchange.Redis,然后下载就可以. ConnectionMultiplexer对 ...
- 搜索条件两个时间,通过php数组排序,保证select语句between时间 前小后大
//搜索条件两个时间,通过数组排序,保证select语句between时间 前小后大 $sort_array=[$_POST['clockDate1'],$_POST['clockDate2']]; ...
- CAD绘制一个半径标注(com接口VB语言)
主要用到函数说明: _DMxDrawX::DrawDimRadial 绘制一个半径标注.详细说明如下: 参数 说明 DOUBLE dCenterX 被标注的曲线的中点X值 DOUBLE dCenter ...
- list.h在用户态下的应用
一.背景 list.h文件位于linux/include下,内核中链表的操作函数都在其中.它有许多关于链表的操作函数,所以我们可以尝试将list.h拉到用户态中来使用,这样,我们在用户态中若要用到链表 ...
- sysbench测试阿里云ECS云磁盘的IOPS,吞吐量
测试阿里云ECS 对象:在aliyun上买了一个ECS附加的云盘,使用sysbench测试云盘的IOPS和吞吐量 sysbench prepare 准备文件,10个文件,1个1G [root@iZwz ...