(* * Copyright 1987, 1989 Samuel H. Smith; All rights reserved * * This is a component of the ProDoor System. * Do not distribute modified versions without my permission. * Do not remove or alter this notice or any other copyright notice. * If you use this in your own program you must distribute source code. * Do not use any of this in a commercial product. * *) (* * Copy or Move files; changes time stamps (3-1-89) * *) (* ------------------------------------------------------------ *) procedure copy_file(source,dest: string65); (* copy a file from one place to another *) const bufmax = $8000; {maximum buffer size} extra = $800; {extra heap to leave free} var avail: longint; bufsize: word; {actual buffer size} buf: ^byte; ifd: dos_handle; ofd: dos_handle; n,w: word; begin ifd := dos_open(source,open_read); if ifd = dos_error then exit; ofd := dos_create(dest); if ofd = dos_error then begin dos_close(ifd); exit; end; bufsize := bufmax; avail := dos_maxavail-extra; if bufsize > avail then bufsize := avail; if avail < 1 then begin (**) make_log_entry('Can''t allocate COPY_FILE buffer!',true); (**) exit; end; dos_getmem(buf,bufsize); repeat n := dos_read(ifd,buf^,bufsize); dos_write(ofd,buf^,n); w := dos_regs.ax; until w <> bufsize; dos_freemem(buf); dos_close(ifd); dos_close(ofd); if w <> n then begin dos_unlink(dest); (**) make_log_entry('Sorry, no disk space for '+dest,true); (**) (*** writeln(^G'DISK FULL! Copying to ',dest); ***) end; end; (* ------------------------------------------------------------ *) procedure move_file(source,dest: string65); (* move a file from one place to another; quickly rename if possible, otherwise copy and delete. touches file to make file-date = date moved or copied *) var tfd: file of byte; buf: byte; begin (* try to rename the file (fastest way, only on same device) *) assign(tfd,source); {$i-} rename(tfd,dest); {$i+} if ioresult = 0 then begin (* move worked, touch the file to set last update date/time to today's date. otherwise file may have strange date as set by the transfer protocol. this makes date = date uploaded *) {$i-} assign(tfd,dest); reset(tfd); read(tfd,buf); seek(tfd,0); write(tfd,buf); close(tfd); {$i-} if ioresult <> 0 then {couldn't "touch" file} ; exit; end else (* rename failed, just copy the file and delete original *) begin copy_file(source,dest); dos_unlink(source); end; end;