-
c语言入门之关于文件复制的程序代码
这是一个关于文件拷贝的例程,希望有人可以用上,不用再摸索了。
#include <stdio.h>
#include <sys\stat.h>
bool ForceExist;
const bufsize = 409600; //基本单位为400K
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text = ExtractFilePath(ParamStr(0));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (OpenDialog1->Execute())
{
AnsiString fFile = OpenDialog1->FileName;
AnsiString tFile = Edit1->Text+ExtractFileName(fFile);
if (CopyFile(fFile,tFile))
{
//复制成功....
}
else {
ForceExist = false;
DeleteFile(tFile);
}
}
}
//---------------------------------------------------------------------------
bool TForm1::CopyFile(AnsiString FromFile,AnsiString ToFile)
{
bool result(false);
FILE *FromF,*ToF;
int NumRead,NumWritten;
/* BUFSIZ is defined in stdio.h */
char buf[bufsize];
Screen->Cursor = crHourGlass;
ToF = fopen(ToFile.c_str(),"wb");
FromF = fopen(FromFile.c_str(),"rb");
try
{
StartTime = Now();
struct stat statbuf;
/* get information about the file */
fstat(fileno(FromF), &statbuf);
int ModVal = statbuf.st_size % bufsize;
int MaxVal = statbuf.st_size / bufsize;
if (ModVal) MaxVal++;
ProgressBar1->Max = MaxVal;
float fSize = statbuf.st_size;
TVarRec args[2] = {0,fSize};
lblFileSize->Caption = Format("文件大小: %.*n字节", args, 1);
lblStartTime->Caption = "开始时间: "+FormatDateTime("hh:nn:ss",StartTime);
ForceExist = false;
ProgressBar1->Position = 0;
do
{
if (ProgressBar1->Position<MaxVal-1)
{
NumRead = fread(&buf, sizeof(buf), 1, FromF); // read the data
NumWritten = fwrite(&buf, sizeof(buf), 1, ToF); // Write the data
fSize = bufsize * (ProgressBar1->Position + 1);
}
else if (ModVal) {//当剩余的数据不足400K时,需作特殊处理...
char *Smallbuf;
Smallbuf = (char *)SysGetMem(ModVal);
NumRead = fread(Smallbuf, ModVal, 1, FromF); // read the data
NumWritten = fwrite(Smallbuf, ModVal, 1, ToF); // Write the data
fSize += ModVal;
SysFreeMem(Smallbuf);
NumRead = 0;
}
ProgressBar1->Position++;
TVarRec args[2] = {0,fSize};
lblFileTrans->Caption = Format("已经复制: %.*n字节", args, 1);
lblElapseTime->Caption = "已用时间: "+FormatDateTime("hh:nn:ss",Now()-StartTime);
Application->ProcessMessages();
}
while (!ForceExist && (NumRead!=0 || NumRead==NumWritten));
ProgressBar1->Position++;
fclose(ToF);
fclose(FromF);
result = !ForceExist;
}
catch(...)
{
fclose(ToF);
fclose(FromF);
MessageDlg("在复制文件时出现错误,未能完成操作。", mtWarning, TMsgDlgButtons() << mbOK, 0);
}
Screen->Cursor = crDefault;
return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnStopClick(TObject *Sender)
{
if (MessageDlg("正在复制文件,是否要取消操作?", mtWarning, TMsgDlgButtons() << mbYes << mbNo, 0)==mrYes)
ForceExist = true;
}
//---------------------------------------------------------------------------
栏目列表
最新更新
C#基于接口设计三层架构Unity篇
C#线程 入门
C#读取静态类常量属性和值
C# 插件式编程
C# 委托与事件有啥区别?
C#队列学习笔记:队列(Queue)和堆栈(Stack
linq 多表分组左连接查询查询统计
C#队列学习笔记:MSMQ入门一
C# 基础知识系列- 1 数据类型
二、C#入门—基础语法
C# 在Word中添加Latex 数学公式和符号
inncheck命令 – 检查语法
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
SqlServer 利用游标批量更新数据
BOS只读状态修改
SQL Server等待事件—PAGEIOLATCH_EX
数据库多行转换为单一列
获取数据表最后最后访问,修改,更新,
计算经历的时间
SQL查询结果自定义排序
修改数据库默认位置
日期简单加或减
从日期获取年,月或日