#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通天遁地]七、数据与安全-(9)文件的压缩和解压

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

  2. 关于vector.size()和string.length() 的返回类型 size_type

    今天写循环的时候碰到一个问题,发现:string.length()返回的类型是size_type.它是unsigned 类型.string::size_type它在不同的机器上,长度是可以不同的,并非 ...

  3. [转]linux之awk命令

    转自:http://blog.chinaunix.net/uid-23302288-id-3785105.html awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓 ...

  4. Linux egrep命令

    Linux egrep命令用于在文件内查找指定的字符串. egrep执行效果与"grep-E"相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法. e ...

  5. Squirrel的安装(windows上Phoneix可视化工具)

    一.下载安装 下载地址:http://www.squirrelsql.org/下载所需版本       或者 从网址http://www.squirrelsql.org/下载相应版本的squirrel ...

  6. [ ZJOI 2006 ] Mahjong

    \(\\\) \(Description\) 现有权值分别为\(1\text~100\)的\(100\)种牌,分别给出每种排的张数\(A_i\),试判断能否胡牌,胡牌需要将所有牌不重不漏地分成以下几类 ...

  7. Hash二次探测

    Hash的二次探测,当hash的长度为n:插入val,当Hash[val]不为0时,选择新地址newval = val +(-) 1*1,val+(-)2*2,val+(-)(n-1)*(n-1); ...

  8. Burn Down Chart(2018.6.4~2018.6.10)

    Burn Down Chart (2018.6.4~2018.6.10) 娄雨禛[前端部分] 曾子轩[后端部分+燃尽图] 前端 1. 娄雨禛+李鑫 1)在总工程中完成跳转,实现图片显示,并发布到Git ...

  9. python发送文本邮件

    #!/usr/bin/env python #coding=utf-8 #Author: Ca0Gu0 import time import smtplib from email.mime.text ...

  10. yum仓库配置ftpx协议

    [root@localhost ~]# iptables -F[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# syste ...