首页 > 其他分享 >带进度条复制文件代替copyfile

带进度条复制文件代替copyfile

时间:2024-08-05 08:57:22浏览次数:10  
标签:copyfile begin SourceF 进度条 TargetF ProgressBar1 Form1 复制 end

代替copyfile,效率会低,少用,并且不适合大文件。
unit UnitCopy;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons,
ActiveX,
Comobj,
ShlObj,
TlHelp32,
Winapi.ShellAPI, Vcl.ComCtrls;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
ProgressBar1: TProgressBar;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Procedure myFileCopy(const SourceFile, TargetFile: string);
var
SourceF, TargetF: file;
iRead, iWrite: integer;
Buf: array[1..2048] of char;
FS: TFileStream;
isize:Integer;
begin
FS := TFileStream.Create(SourceFile, fmShareDenyNone);
isize:=FS.Size;
FS.Free;
//用ProgressBar控件
Form1.ProgressBar1.Position:=0;
Form1.ProgressBar1.Max:=isize;
Application.ProcessMessages;

AssignFile(SourceF, SourceFile);
reset(SourceF,1);
AssignFile(TargetF, TargetFile);
Rewrite(TargetF,1);
repeat
BlockRead(SourceF, Buf, sizeof(Buf), iRead);
BlockWrite(TargetF, Buf, iRead, iWrite);
Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+iWrite;
Application.ProcessMessages;
until (iRead = 0) or (iWrite <> iRead);
closefile(SourceF);
closefile(TargetF);
end;

procedure myFileCopy2(const SourceFile, TargetFile: string);
var
SourceF,TargetF: TFileStream;
num, n: Integer;
buf: PByte;
block: Integer;
begin
if FileExists(TargetFile) then
DeleteFile(TargetFile);
SourceF := TFileStream.Create(SourceFile, fmOpenRead or fmShareExclusive);
TargetF := TFileStream.Create(TargetFile, fmCreate);
num := SourceF.Size;
//TargetF.Size := num;
SourceF.Position := 0;
//TargetF.Position := 0;
block := num div 100;
GetMem(buf, block);
Form1.ProgressBar1.Max := 100;
Form1.ProgressBar1.Min := 0;
Form1.ProgressBar1.Position := 0;
while num <> 0 do
begin
Application.ProcessMessages;
n := block;
if n > num then n := num;
SourceF.ReadBuffer(buf^, n);
TargetF.WriteBuffer(buf^, n);
Form1.ProgressBar1.Position := Trunc((1 - num / SourceF.Size) * 100);
Dec(num, n);
end;
SourceF.Free;
TargetF.Free;
Form1.ProgressBar1.Position := 100;
end;

procedure CloseThread(exename:string);
var
lppe: TProcessEntry32;
snapshothandle:THandle;
f:boolean;
pid:DWord;
ProcessName:string;
begin
ProcessName:=exename;
snapshothandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
lppe.dwSize:=Sizeof(lppe);
f:=Process32First(snapshothandle,lppe);
While f do
begin
if UpperCase( ChangeFileExt(ProcessName,'') )=UpperCase( ChangeFileExt(StrPas(lppe.szExeFile),'') ) then
begin
pid:=lppe.th32ProcessID;
TerminateProcess(OpenProcess(Process_Terminate,false,pid),0);
end;
f:=Process32Next(snapshothandle,lppe);
end;
CloseHandle(snapshothandle);
end;

procedure myyanshi(haomiao: Cardinal);
var t:Int64;
begin
t:=GetTickCount64();
while GetTickCount64()-t<haomiao do
begin
Sleep(5);
application.ProcessMessages;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
//关闭主程序,参数名进程的显示名称即exe的名称
CloseThread('数据上传.exe');
myyanshi(1000);
//复制文本并替换
DeleteFile('D:\AD未备份20230619\数据上传.exe');
CopyFile( '\192.168.0.241\ljk\数据上传.exe','D:\AD未备份20230619\数据上传.exe',False);
myyanshi(1000);
//打开
ShellExecute(self.Handle,'open',PChar('D:\AD未备份20230619\数据上传.exe'),'','',SW_SHOWNORMAL );
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
myFileCopy('C:\芯片\kang.rar','c:\kang.mp4');
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
myFileCopy2('c:\ljk.mp4','c:\kang.mp4');
end;

end.

标签:copyfile,begin,SourceF,进度条,TargetF,ProgressBar1,Form1,复制,end
From: https://www.cnblogs.com/ljk2008/p/18342541

相关文章

  • c语言数据结构单链表中随机链表的复制
    c语言数据结构单链表中随机链表的复制文章目录c语言数据结构单链表中随机链表的复制1.随机链表的复制问题2.解决思路3.代码的实现1.随机链表的复制问题给你一个长度为nn......
  • MySQL-主从复制
    目录概述原理搭建概述主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制MySQ......
  • Ubuntu22.04 + Mysql5.7 + Docker + 主备复制方案
    同时运行两个MySQL5.7容器。这种方式可以实现数据库的主-备复制架构,提高系统的可靠性。下面是一个示例,演示如何运行两个MySQL5.7容器,一个作为主节点,一个作为备节点:1.运行主MySQL容器:sudodockerrun-d\--namemysql-57-master\--restart=always\......
  • 神奇的进度条!水缸进度动画效果怎么实现的?
    最近看到一个非常有趣的动画效果:水波进度动画,想了一下实现思路,分享给大家~效果如下图片图片基本组件代码先把最基础的组件代码样式写出来,其实无非就是四个部分:1、圆形水缸2、水波2、百分比数字3、进度条我们先把圆形水缸、百分比数字、进度条画出来,水波待会再......
  • Linux操作中遇到的复制粘贴问题
    今天在gitclone的时候发现Linux和Windows之间的复制粘贴并不同步,也就是说Linux和Windows只能在各自的界面进行复制粘贴操作。我从VirtualBox管理器界面入手,右键虚拟机,点击设置在常规——高级项里,可以看到共享粘贴板和拖放,默认的是已禁用,我就直接将它们全部改为双向了。另外,......
  • Linux命令快速复习,复制到记事本,忘记就ctrl+f速查
    命令:通用格式:command[-options][parameter];-options控制行为细节,parameter命令的指向目标ls[-a-l-h][Linux路径];显示目标路径下的文件;-a显示以.开头的隐藏项,-l列表形式展现更多信息,-h要与-l同时使用显示文件大小cd[Linus路径];切换目录,无参数切换到HOME目录【changed......
  • 高性能数据库架构:掌握主从复制技术
    一、数据库主从复制的概念数据库主从复制是一种常用的技术,用于提高数据库系统的可用性、性能和可靠性。通过将数据从主数据库(master)复制到从数据库(slave),可以实现数据的备份、负载均衡和高可用性。以下是对数据库主从复制的详细解释及其在MySQL中的具体实现步骤和示例。1.......
  • MongoDB复制集/集群搭建详解
    文章目录复制集介绍三节点复制集模式Pss模式PSA模式典型三节点复制集环境搭建注意事项搭建配置复制集复制集状态查询复制集常用命令安全认证创建用户创建keyFile文件启动mongod复制集连接方式复制集成员角色属性成员角色配置隐藏节点配置延时节点添加投票节点移除复制......
  • el-progress 自定义线状进度条右边的文字
    需要展示类似下面的效果 搜了很多slot的方式试了都不行,好像是因为我后面的文字太长了导致了换行,加上这边需要加其他的样式,最后干脆将原始的文字变成空的,自己写右边的文字加样式了<divstyle="margin:10px020px0"v-f......
  • redis主从复制、哨兵模式、集群
    redis集群高可用redis集群的三种模式:1.主从复制(奇书3台一主两从)2.哨兵模式(3台一主两从)3.cluster(集群6333)主从复制:喝MySQL的主从复制类似,主可以写,写入主的数据通过RDB方式把数据同步到从服务器。从不能更新到主。也是哨兵模式的基础。缺点:没有办法进行故障自动......