标题:超强文件剪切与合并器(可以处理任何格式的文件,文件大小不大于1TB)
只看楼主
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
结帖率:70%
 问题点数:0 回复次数:13 
超强文件剪切与合并器(可以处理任何格式的文件,文件大小不大于1TB)
splitf.exe /s [2] a.txt     (剪切成2个文件)
splitf.exe /m [10] jiaru.mp3    (合并10个文件)  
本程序采用字符命令提示符号在运行的,将splitf.exe文件移到某个文件夹下,如在D:\Resource则我们可以按如下操作:
1、将您要处理的文件放到Resource目录下
2、打开字符命令提示符(开始菜单--所有程序--附件--命令提示符)
3、键入d:按回车(这样就进入d盘了)
4、键入cd\Resource按回车(这样就进入Resource目录了)、
5、如果要剪切文件则输入形如splitf.exe /s [2] jiaru.mp3按回车,其中[]里的数字是要剪切的数目比如剪切成2个文件每个文件大小差不多)
6、如果要合并文件则输入形如splitf.exe /m [10] jiaru.mp3([]里的数字是要合并文件的个数默认是     20,要求每个文件按自己想合并的顺序依次命名为jiaru1.mp3,jiaru2.mp3,jiaru3.mp3依次类推

[[it] 本帖最后由 faminxmu 于 2008-12-8 20:43 编辑 [/it]]

splitf.rar (9.44 KB)
搜索更多相关主题的帖子: 文件 剪切 
2008-12-07 23:21
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
得分:0 
/*******************************************
   文件名:splitf.c
   作者:发哥
   版本历史:2008-12-7 V1.0
********************************************/

#include<stdio.h>
#include<string.h>
#define BIT_SIZE 1024
#define NAME_ESIZE 20
void main(long argc,char*argv[])//splitf.exe /s [1024] afile.dat
{
     long getNumber(char*p);//获取[]里的数字
     void getName(char*p,char firstInFileName[],char lastInFileName[]);//获取文件名
     char getChoose(char*p);//选择的字母
     void splitf(char firstInFileName[],char lastInFileName[],long number);//剪切函数
     void combination(char firstInFileName[],char lastInFileName[],long number);//合并函数
     long number,i=1;
     char firstInFileName[NAME_ESIZE],lastInFileName[NAME_ESIZE],choose;
     if(argc!=4)
     {
                printf("请输入如下格式:\n     splitf.exe /s [数字] afile.dat\n或者:splitf.exe /m [数字] afile.dat\n");
                return 0;
                }
     number=getNumber(argv[2]);
     choose=getChoose(argv[1]);
     getName(argv[3],firstInFileName,lastInFileName);
     if(choose=='s') splitf(firstInFileName,lastInFileName,number);
     else if(choose=='m') combination(firstInFileName,lastInFileName,number);
     else
     {
                printf("请输入如下格式:splitf.exe /s [数字] afile.dat\n或者:splitf.exe /m [数字] afile.dat\n");
                return 0;
                }
                }
long getNumber(char*p)
{
    long number;
    char *sNumber=(char *)malloc(NAME_ESIZE);
    strcpy(sNumber,p);
    sNumber[0]='0';
    sNumber[strlen(sNumber)-1]=0;
    number=atoi(sNumber);
    free((void*)sNumber);
    return number;
}
void getName(char*p,char firstInFileName[],char lastInFileName[])
{
     long j,i,len,point;
     len=strlen(p);
     for(i=len-1,point=0;i>=0;i--)
     if(*(p+i)=='.') point=i;
     if(point==0||point==len-1){printf("文件名应包含扩展名!\n");return;}
     for(i=0;i<point;i++)
     firstInFileName[i]=*(p+i);
     firstInFileName[i]=0;
     for(i=point+1,j=0;i<=len;i++,j++)
     lastInFileName[j]=*(p+i);
     }
char getChoose(char*p)
{
     char ch;
     if(strlen(p)!=2||*p!=47)//斜杠
     {
                                     printf("输入错误!\n");
                                     return 0;
                                     }
     ch=*(p+1);
     return ch;
     }
void splitf(char firstInFileName[],char lastInFileName[],long num)
{
     char *buffer,*fileName;
     long i=1,fileSize,n,filecount,sizecount,j=1,number;
     FILE *in,*out;
     if(num<2){printf("输入数字应大于1!\n");return;}
     fileName=(char*)malloc(NAME_ESIZE);
     sprintf(fileName,"%s.%s",firstInFileName,lastInFileName);
     in=fopen(fileName,"rb");
     if(!in) {printf("找不到指定文件\n");return;}
     fseek(in,0,2);
     fileSize=ftell(in);
     fseek(in,0,0);
     if(fileSize%num==0) number=fileSize/num;
     else number=fileSize/num+1;
     buffer=(char*)malloc(BIT_SIZE);
     filecount=fileSize/number;
     sizecount=number/BIT_SIZE;
     for(i=1;i<=filecount;i++,j=1)
     {
                                 sprintf(fileName,"%s%d.%s",firstInFileName,i,lastInFileName);
                                 out=fopen(fileName,"wb");
                                 while(j<=sizecount)
                                 {
                                                    fread(buffer,BIT_SIZE,1,in);
                                                    fwrite(buffer,BIT_SIZE,1,out);
                                                    j++;
                                                    }
                                 fread(buffer,number-BIT_SIZE*sizecount,1,in);
                                 fwrite(buffer,number-BIT_SIZE*sizecount,1,out);
                                 fclose(out);
                                 }
     if(fileSize-number*filecount-BIT_SIZE*sizecount!=0)
     {
     sprintf(fileName,"%s%d.%s",firstInFileName,i,lastInFileName);
     out=fopen(fileName,"wb");
     sizecount=(fileSize-number*filecount)/BIT_SIZE;
     while(j<=sizecount)
     {
                        fread(buffer,BIT_SIZE,1,in);
                        fwrite(buffer,BIT_SIZE,1,out);
                        j++;
                        }
     fread(buffer,fileSize-number*filecount-BIT_SIZE*sizecount,1,in);
     fwrite(buffer,fileSize-number*filecount-BIT_SIZE*sizecount,1,out);
     fclose(out);
     }
     fclose(in);
     free((void*)buffer);
     free((void*)fileName);
     printf("剪切成功!\n");
     }
void combination(char firstInFileName[],char lastInFileName[],long number)//此函数可以合并大小不一的文件
{
     char *buffer,*fileName;
     long i=1,fileSize,j=1,n;
     FILE *in,*out;
     fileName=(char*)malloc(NAME_ESIZE);
     buffer=(char*)malloc(BIT_SIZE);
     if(number==0) number=NAME_ESIZE;
     sprintf(fileName,"%s.%s",firstInFileName,lastInFileName);
     out=fopen(fileName,"wb");
     for(i=1;i<=number;i++,j=1)
     {
         sprintf(fileName,"%s%d.%s",firstInFileName,i,lastInFileName);
         in=fopen(fileName,"rb");
         if(in==NULL) {printf("找不到第%d个文件!\n",i);return;}
         fseek(in,0,2);
         fileSize=ftell(in);
         fseek(in,0,0);
         n=fileSize/BIT_SIZE;
         while(j<=n)
         {
                    fread(buffer,BIT_SIZE,1,in);
                    fwrite(buffer,BIT_SIZE,1,out);
                    j++;
                    }
         fread(buffer,fileSize-n*BIT_SIZE,1,in);
         fwrite(buffer,fileSize-n*BIT_SIZE,1,out);
         fclose(in);
         }
         fclose(out);
         free((void*)buffer);
         free((void*)fileName);
         printf("合并成功!\n");
         }

[[it] 本帖最后由 faminxmu 于 2008-12-8 20:48 编辑 [/it]]

在虚拟的世界中寻找目标。
2008-12-07 23:22
朗朗
Rank: 1
等 级:新手上路
帖 子:235
专家分:0
注 册:2007-10-2
得分:0 
看上去不错啊
2008-12-08 13:49
rangyiqiang
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2008-12-2
得分:0 
LZ自己编的吗~~~~~~~~~~~~
2008-12-08 16:51
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
嗯,还是不错的。
如果有界面那就更好了

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-12-08 18:27
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
得分:0 
界面啊?我不会啊!这个是老师的作业,写好了顺便传上来了,这个基本功能是能实现了而且处理1G的文件只需要1分钟这样的速度还是可以接受的,还有许多可以改进的地方比如把[]里的字节数换成文件的块数这样比较方便合理,还有些细节没做比如文件名正确性的检查,字节数合理性检查等等,顺便上传经过修改后的代码吧

[[it] 本帖最后由 faminxmu 于 2008-12-8 20:39 编辑 [/it]]

在虚拟的世界中寻找目标。
2008-12-08 19:29
hundnn
Rank: 1
等 级:新手上路
帖 子:123
专家分:0
注 册:2007-8-23
得分:0 
不错。/顶下
2008-12-10 11:55
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
用mfc工程很容易做界面的

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-12-10 19:33
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
得分:0 
回复 第8楼 flyue 的帖子
正在学,对于 API函数感觉挺难掌握的,希望指点一下对MFC的学习,比如注意点,用什么教材、比较好,我上面的处理文件大小好象写错了,因为里面需要求出文件的大小而LONG数据好象还不到达到TB级的

在虚拟的世界中寻找目标。
2008-12-10 19:42
小小学
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-12-11
得分:0 
这个在那里 开始学啊
2008-12-11 16:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-248212-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.539152 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved