⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tool.cpp

📁 本人看了徐景州的分割文件后觉得这确实是一个简单的思路,但是要把他编得更加完美却较难有句话:小事不做何以做大事,编一百个软件不如编好一个软件.本人的分割文件思想是把要分割的文件一次读入内存求的分割的数目
💻 CPP
字号:
////////////////////////////////////////////
//
//  module:   核心模块状
//  date  :   24/03/2005
//  copyright:  1.0
//  author:    晏丹强
////////////////////////////////////////////
#include<windows.h>
#include<string.h>
#include<shellapi.h>
#include<shlobj.h>
#include"tool.h"
#include"resource.h"
HWND hwndprocess;
bool lsroot(LPCTSTR lpszPath)//////////确定是否是根目录
{
	TCHAR szRoot[4];
	wsprintf(szRoot,"%c:\\\0",lpszPath[0]);
		return (lstrcmp(szRoot,lpszPath)==0);
}

			

	
	
LPTSTR DoOpenDir(HWND hwnd)///////打开目录对话框架
{
	static  char tempdir[256]="c:";
	LPMALLOC lpMalloc;
	LPTSTR tt=tempdir;
	
	
     if(SHGetMalloc(&lpMalloc)!=NOERROR)
	{
		MessageBox(0,"初始化失败","error",0);
		return tt=NULL;
	}
		
	BROWSEINFO brow;
	memset(&brow,0,sizeof(brow));
	brow.hwndOwner=hwnd;
	brow.pidlRoot=NULL;
	brow.pszDisplayName=tempdir;
	brow.ulFlags=BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS;
	brow.lpfn=NULL;
	brow.lParam=0;

	LPITEMIDLIST lpItem;
	if((lpItem=::SHBrowseForFolder(&brow))!=NULL)
	{
		if(SHGetPathFromIDList(lpItem,tt))
			return tt;
		else MessageBox(0,"打开目录失败","error",0);
			
	     lpMalloc->Free(lpItem);
	     lpMalloc->Release ();
	}
	
	return tt=NULL;
}
LPTSTR OpenFindFile(HWND hwnd,BOOL jorc)///////////打开文件对话框
{
           
		   OPENFILENAME File;
		  static char filepath[256]="ydq";
		    LPTSTR tempdir=filepath;
		   ZeroMemory(&File,sizeof(File));

		   File.lStructSize=sizeof(File);
	       File.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
	       File.hwndOwner=hwnd;
		   if(jorc==TRUE)///判断是打开目录还是文件
	       File.lpstrFilter="All Files (*.*)\0*.*\0";
	       else
           File.lpstrFilter="All Files (*.join)\0*.join\0";
	       File.nFilterIndex=1;
	       File.lpstrFile=filepath;
	       File.nMaxFile=sizeof(filepath);

			if(GetOpenFileName(&File))
			{
			    return tempdir;
			}
			else 

			
	 return tempdir=NULL;

}

/////////////////////分割文件涵数

void Split(LPTSTR filename,LPTSTR SavePath,DWORD SplitByte)
{

HANDLE handle;
DWORD dw,bytedw,filesize;
FILEINFO fileinfo;
DWORD backbyte;
int  SplitNum;
int i,len;
static BYTE *lpdata,*data;
char temppath[256];
char tempnum[2];
/////////////////////////////////////////////////////////
handle=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,
0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
if(handle==INVALID_HANDLE_VALUE)
{
MessageBox(0,"打开文件错误","split",0);
return ;
}
filesize=GetFileSize(handle,&bytedw);


SplitNum=filesize/SplitByte;///求得分割数量
backbyte=filesize%SplitByte;///剩余字节

lpdata=data=new BYTE[filesize];
if(lpdata==NULL)MessageBox(0,"申请空间失败","split",0);
ReadFile(handle,lpdata,filesize,&dw,0);
CloseHandle(handle);
if(filesize%SplitByte!=0)
SplitNum+=1;


//////////////////////////////////////循环写分割文件
for(i=0;i<SplitNum;i++)
{    
	strcpy(temppath,SavePath);
	if(lsroot(SavePath)==0)
	strcat(temppath,"\\part");
	else
		strcat(temppath,"part");
	wsprintf(tempnum,"%d",i+1);
	strcat(temppath,tempnum);
	
	strcat(temppath,".dat");
	if(i==SplitNum-1&&filesize%SplitByte!=0)
	{
		    handle=CreateFile(temppath,GENERIC_WRITE,FILE_SHARE_READ|
			FILE_SHARE_WRITE,
             0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
              WriteFile(handle,data,backbyte,&dw,0);
           CloseHandle(handle);
	}
	else
	{
	
        handle=CreateFile(temppath,GENERIC_WRITE,FILE_SHARE_READ,
         0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
         WriteFile(handle,data,SplitByte,&dw,0);
         CloseHandle(handle);
		 data+=SplitByte;
		 
	}
	
}

////////////写文件信息
len=strlen(filename);
for( i=len;i>0;i--)
{
   if(filename[i]=='\\')
     break;
}
filename+=i+1;
strcpy(fileinfo.ResouFileName,filename);
fileinfo.TotalByte =filesize;

fileinfo.FileNum =SplitNum;
dw=sizeof(FILEINFO);



if(lsroot(SavePath)==0)
strcat(SavePath,"\\");
strcat(filename,".join");
strcat(SavePath,filename);

handle=CreateFile(SavePath,GENERIC_WRITE,FILE_SHARE_READ|
				  FILE_SHARE_WRITE,
0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
WriteFile(handle,&fileinfo,sizeof(FILEINFO),&dw,0);
CloseHandle(handle);
delete []lpdata;
lpdata=NULL;
MessageBox(0,"分割完成","split",0);
		  

}
//////////////////////////////合并文件涵数
void Join(LPTSTR filename,LPTSTR savepath)
{

   HANDLE handle;
   DWORD dw;
   DWORD filesize;
   DWORD TotalSize;
   LPTSTR templp=filename;
   FILEINFO file;
   BYTE *lpdata,*data,*joindata;

   int j,filenum,num;
   int filestrlen;
   
   char resname[256]={0};
   char pathtemp[10]="part";
   char numchar[2];
   char temppath[256]={0};
   
   
       handle=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|
				  FILE_SHARE_WRITE,
                  0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
       ReadFile(handle,(FILEINFO*)&file,sizeof(FILEINFO),&dw,0);
	   filenum=file.FileNum ;
	   strcpy(resname,file.ResouFileName);
	   TotalSize=file.TotalByte;
	   filestrlen=strlen(filename);
	   strcpy(temppath,filename);
	   
	   lpdata=data=new BYTE[TotalSize];
	   if(lpdata==NULL)MessageBox(0,"申请空间出错","split",0);
	   CloseHandle(handle);
	   ////////////////////////////////////////////////////////
	   for(;filestrlen>0;filestrlen--)
		   if(filename[filestrlen]=='\\')
			   break;
		   filestrlen+=1;///获得文件的文件名
		   
		   filename+=filestrlen;
	  
	   for(j=0;j<filenum;j++)
	   {  
		   strcpy(filename,pathtemp);
		   wsprintf(numchar,"%d",j+1);
		   strcat(filename,numchar);
		   strcat(filename,".dat");
		   
		  
		   handle=CreateFile(templp,GENERIC_READ,FILE_SHARE_READ,
                0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
		   filesize=GetFileSize(handle,&dw);
		   joindata=new BYTE[filesize];
		   if(joindata==NULL)MessageBox(0,"申请空间出错","split",0);
		   ReadFile(handle,joindata,filesize,&dw,0);
		   memcpy(data,joindata,filesize);
		   ////////////////连接内存数据
		   data+=filesize;
		   CloseHandle(handle);
		   delete []joindata;
	   }
	   if(!lsroot(savepath))
	   strcat(savepath,"\\");
	   strcat(savepath,resname);
	   handle=CreateFile(savepath,GENERIC_WRITE,FILE_SHARE_READ,
         0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
         WriteFile(handle,lpdata,TotalSize,&dw,0);
		 delete []lpdata;
		 lpdata=NULL;
         CloseHandle(handle);
		 MessageBox(0,"合并文件成功","split",0);
}

           



	

       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -