#include #include #include #include #include #define MAX_BYTES 64000000 #define BUF_SIZE 1024000 void combine(); void divide(const String &pathFileName); void main(int argc,char ** argv) { String command; if(argc<2) { ::printf("USAGE parts {divide[filename]|combine} {filename} ** if combine then filename \n"); return; } command=argv[1]; if(command=="divide") { if(argc!=3) { ::printf("USAGE parts {divide[filename]|combine} {filename} ** if combine then filename \n"); return; } divide(argv[2]); } else if(command=="combine")combine(); else ::printf("unknown command\n"); } void combine() { Array bytes; File inFile; File outFile; DWORD part=0; DWORD readCount=0; String strPathFileName; if(!outFile.open("result.dat","wb")) { ::printf("unable to open output 'result.dat'\n"); return; } bytes.size(BUF_SIZE); while(true) { ::sprintf(strPathFileName,"part_%d.dat",part); if(!inFile.open(strPathFileName,"rb")) { ::printf("unable to open %s\n",strPathFileName.str()); return; } ::printf("Reading %s\n",strPathFileName.str()); while(0!=(readCount=inFile.read((char*)&bytes[0],bytes.size()))) outFile.write((char*)&bytes[0],readCount); inFile.close(); part++; } } void divide(const String &strPathInput) { Array bytes; DWORD part=0; DWORD count=0; DWORD byteCount=0; DWORD totalCount=0; String strPathFileName; File inFile; File outFile; bytes.size(BUF_SIZE); if(!inFile.open(strPathInput,"rb")) { ::printf("Cannot open input\n"); return; } ::sprintf(strPathFileName,"part_%d.dat",part); if(!outFile.open(strPathFileName,"wb")) { ::printf("cannot open output '%s'\n",strPathFileName.str()); return; } while(true) { if(count>MAX_BYTES) { outFile.close(); part++; ::sprintf(strPathFileName,"writing 'part_%d.dat'",part); if(!outFile.open(strPathFileName,"wb")) { ::printf("cannot open output '%s'\n",strPathFileName.str()); return; } count=0; } byteCount=inFile.read((char*)&bytes[0],bytes.size()); if(!byteCount)break; if(!outFile.write(&bytes[0],byteCount)) { ::printf("Unable to write to '%s'\n",strPathFileName.str()); return; } count+=byteCount; totalCount+=byteCount; // if(!(totalCount%BUF_SIZE))::printf("Wrote %d bytes to %s\n",totalCount,strPathFileName.str()); } }