'**************************************************************************** ' ' FileCopy in PowerBASIC 3.1/3.2 ' ' entwickelt von / developed by : Thomas Gohel ' Fido : Thomas Gohel@2:2410/330.1 ' InterNet: author@pbsound.snafu.de ' Homepage: http://www.snafu.de/~pbsound/ ' '**************************************************************************** $COMPILE EXE DECLARE FUNCTION GetStrLoc (BYVAL INTEGER) AS INTEGER DECLARE FUNCTION FileCopy%(BYVAL Source$, BYVAL Destination$) SHARED FileCopyError% PRINT PRINT PRINT "FileCopy mit/with PowerBASIC 3.1/3.2";TAB(50);"(c) 1994/96 von/by Thomas Gohel"; PRINT DosIoError% = FileCopy%("F:\TEST\TEST.TXT", "F:\TEST\TEST.BAK") IF DosIoError% > 0 THEN PRINT PRINT "Error detected: ";DosIoError%; "("; SELECT CASE DosIoError% CASE 1 PRINT "filesharing software not found/function number invalid"; CASE 2 PRINT "file not found"; CASE 3 PRINT "path not found"; CASE 4 PRINT "too many open files (no handles available)"; CASE 5 PRINT "access denied"; CASE 12 PRINT "access code invalid"; END SELECT PRINT ")" ELSE PRINT PRINT "Ok" END IF END FUNCTION FileCopy%(BYVAL Source$, BYVAL Destination$) public LOCAL SourceHandle%, DestinationHandle% LOCAL FileDate%, FileTime% LOCAL BufferLenght% LOCATE , 3: PRINT "Kopiere/Copying: ";Source$ LOCATE , 3: PRINT " nach/to: ";Destination$ '*** Variablen Init *** Source$ = Source$ + CHR$(0) Destination$ = Destination$ + CHR$(0) BufferLenght% = 32000 Copy$ = STRING$(BufferLenght%, 0) '*** Source-Datei ”ffnen / open sourcefile *** ! push ds ! les di, Source$ ; Handle von Source$ holen ! push di ; auf Stack ! call GetStrLoc ; Adresse holen ! mov ds, dx ; DX:AX auf DS:DX umkopieren ! mov dx, ax ; ! mov ax, &h3d90 ! int &h21 ! pop ds ! jnc SourceFileOpenOk ! mov FUNCTION, ax ! jmp FileCopyExit SourceFileOpenOk: ! mov SourceHandle%, ax '*** Destination-Datei ”ffnen / open destination file *** ! push ds ! les di, Destination$ ; Handle von Destination$ holen ! push di ; auf Stack ! call GetStrLoc ; Adresse holen ! mov ds, dx ; DX:AX auf DS:DX umkopieren ! mov dx, ax ; ! mov ax, &h3c00 ! mov cx, &h0 ! int &h21 ! pop ds ! mov DestinationHandle%, ax ! jnc DestinationFileOpenOk ! mov FUNCTION, ax ! jmp FileCopyExit DestinationFileOpenOk: '*** Source-Datei einlesen / read sourcefile *** DO WHILE BufferLenght% = 32000 ! push ds ! les di, Copy$ ; Handle von Copy$ holen ! push di ; auf Stack ! call GetStrLoc ; Adresse holen ! mov ds, dx ; DX:AX auf DS:DX umkopieren ! mov dx, ax ; ! mov ax, &h3F00 ! mov bx, SourceHandle% ! mov cx, BufferLenght% ! int &h21 ! pop ds ! mov BufferLenght%, ax ! jnc ReadOk ! mov FUNCTION, ax ! jmp FileCopyExit ReadOk: '*** Destination-Datei schreiben / write destination file *** ! push ds ! les di, Copy$ ; Handle von Copy$ holen ! push di ; auf Stack ! call GetStrLoc ; Adresse holen ! mov ds, dx ; DX:AX auf DS:DX umkopieren ! mov dx, ax ; ! mov ax, &h4000 ! mov bx, DestinationHandle% ! mov cx, BufferLenght% ! int &h21 ! pop ds ! mov BufferLenght%, ax ! jnc WriteOk ! mov FUNCTION, ax ! jmp FileCopyExit WriteOk: LOOP '*** Quelle-Datei Datum lesen / read time/date *** ! mov ax, &h5700 ! mov bx, SourceHandle% ! int &h21 ! mov FileTime%, cx ! mov FileDate%, dx ! jnc ReadTimeStampOk ! mov FUNCTION, ax ! jmp FileCopyExit ReadTimeStampOk: '*** Ziel-Datei Datum schreiben / write date/time *** ! mov ax, &h5701 ! mov bx, DestinationHandle% ! mov cx, FileTime% ! mov dx, FileDate% ! int &h21 ! jnc WriteTimeStampOk ! mov FUNCTION, ax ! jmp FileCopyExit WriteTimeStampOk: '*** Quelle- & Destination-Datei schlieáen / close files *** CloseAllFiles: ! mov ax, &h3E00 ! mov bx, SourceHandle% ! int &h21 ! jnc SourceFileCloseOk ! mov FUNCTION, ax ! jmp FileCopyExit SourceFileCloseOk: ! mov ax, &h3E00 ! mov bx, DestinationHandle% ! int &h21 ! jnc DestinationFileCloseOk ! mov FUNCTION, ax ! jmp FileCopyExit DestinationFileCloseOk: ! mov FUNCTION, 0 FileCopyExit: END FUNCTION