源代码: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 ...
随机推荐
- [App Store Connect帮助]三、管理 App 和版本(2.1)输入 App 信息:查看和编辑 App 信息
在您添加 App 至您的帐户后,您也可以在“我的 App”部分查看和编辑 App 信息和平台版本信息. 在输入 App 信息前,请检查必填项.可本地化和可编辑属性.您在上传构建版本或提交您的 App ...
- ACM_最值差(线段树区间查询最值)
最值差 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定N个数A1A2A3A4...AN.求任意区间Ai到Aj中的最大数与最小 ...
- ACM_Ruin of Titanic(简单贪心)
Ruin of Titanic Time Limit: 2000/1000ms (Java/Others) Problem Description: 看完Titanic后,小G做了一个梦.梦见当泰坦尼 ...
- 使用UAParser在C#MVC项目中如何判断用户是在用什么设备进行访问(手机,平板还是普通的电脑)
现在我们开发的很多web应用都要支持手机等移动设备.为了让手机用户能有更加好的用户体验,我们经常为手机设备专门准备一套前端的页面.这样当用户使用普通电脑来访问的时候,我们的应用就向用户展示普通电脑的页 ...
- .net Jquery动态显示当前时间
<span id="Timer"></span> <script type="text/javascript"> $(fun ...
- js基础---数据类型转换
js中数据类型: 简单数据类型: number:233,-34,0x23,023 string:"hello"或者'hello' boolean:true.false undefi ...
- 在ubuntu系统下下载和卸载skype
1.下载 sudo apt-get install skypeforlinux 2.卸载 sudo apt remove skypeforlinux
- Android通过透明度设置背景变暗
变暗 WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.alpha=0.3f; getWindow().addFlags(Wi ...
- jQuery与js的区别,并有基本语法详解,
通过过一下对比,我们能很清楚的发现jquery与js的区别,运用jquery能大量减少代码量,不过js里面关于时间的setinterval和settimeout只能用js <script src ...
- 【译】x86程序员手册14-5.1段转换
5.1 Segment Translation 段转换 Figure 5-2 shows in more detail how the processor converts a logical add ...