'**************************************************************************** ' ' Long FileName Copy (Windows95) fuer/for 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/ ' ' Version 1.00 ' '**************************************************************************** $COMPILE EXE DECLARE FUNCTION GetStrLoc (BYVAL INTEGER) AS INTEGER DECLARE FUNCTION FileCopy%(BYVAL Source$, BYVAL Destination$) SHARED FileCopyError% PRINT PRINT PRINT "FileCopy95 mit/with PowerBASIC 3.1/3.2";TAB(50);"(c) 1994/97 von/by Thomas Gohel"; PRINT DosIoError% = FileCopy%("TEST.Text", "TEST.Backup") LOCATE ,3: PRINT IF DosIoError% > 0 THEN LOCATE, 3: PRINT LOCATE, 3: 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 6 PRINT "source file not found"; CASE 12 PRINT "access code invalid"; END SELECT PRINT ")" ELSE LOCATE ,3: PRINT LOCATe, 3: PRINT "Ok" END IF END FUNCTION FileCopy%(BYVAL Source$, BYVAL Destination$) public LOCAL SourceHandle%, DestinationHandle% LOCAL FileDate%, FileTime% LOCAL BufferLenght% LOCAL LFN% LFN% = LFNSupport% SELECT CASE LFN% LOCATE , 3 CASE 1 : PRINT "LFN Support enabled" CASE ELSE: PRINT "LFN Support not found" END SELECT LOCATE , 3: PRINT LOCATE , 3: PRINT "Kopiere/Copying: ";Source$ LOCATE , 3: PRINT " nach/to: ";Destination$ LOCATE , 3 '*** Variablen Init *** Source$ = Source$ + CHR$(0) Destination$ = Destination$ + CHR$(0) BufferLenght% = 32000 Copy$ = STRING$(BufferLenght%, 0) '*** Source-Datei ”ffnen / open sourcefile *** IF LFN% = 0 THEN ! 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 ; DOS Open ! int &h21 ! pop ds ELSE ! push ds ! les di, Source$ ; Handle von Source$ holen ! push di ; auf Stack ! call GetStrLoc ; Adresse holen ! mov ds, dx ; Quelle auf DS:SI umkopieren ! mov si, ax ; ! mov ax, &h716C ; Windows95 Open ! mov bx, &h0000 ! mov cx, &h0000 ! mov dx, &h0001 ! mov di, 1 ! int &h21 ! pop ds END IF ! jnc SourceFileOpenOk ! mov FUNCTION, ax ! jmp FileCopyExit SourceFileOpenOk: ! mov SourceHandle%, ax '*** Destination-Datei ”ffnen / open destination file *** IF LFN% = 0 THEN ! 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 ELSE ! push ds ! les di, Destination$ ; Handle von Source$ holen ! push di ; auf Stack ! call GetStrLoc ; Adresse holen ! mov ds, dx ; Quelle auf DS:SI umkopieren ! mov si, ax ; ! mov ax, &h716C ; Windows95 Open ! mov bx, &h0002 ! mov cx, &h0000 ! mov dx, &h0012 ! mov di, 1 ! int &h21 ! pop ds END IF ! mov DestinationHandle%, ax ! jnc DestinationFileOpenOk ! mov FUNCTION, ax ! jmp FileCopyExit DestinationFileOpenOk: '*** Source-Datei einlesen / read sourcefile *** DO WHILE BufferLenght% = 32000 PRINT "."; ! 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 ! mov ax, &h3E00 ! mov bx, DestinationHandle% ! int &h21 ! mov FUNCTION, 0 FileCopyExit: END FUNCTION FUNCTION LFNSupport% public Dummy% = 0 ! mov ax, &h3306 ; wahre DOS Version ermitteln, ! mov bx, &h0 ; unter Umgehung von SETVER ! int &h21 ! cmp bx, 7 ; => 7 dann MS-DOS 7.0 ! jc NoLFN ! mov ax, &h714F ; NextDir als Dummy aufrufen, denn ! int &h21 ; hier erfolgt immer ein Carry-Flag. ' Allerdings erkennen wir dann an AX ' ob der LFN-Support vorhanden ist. ! cmp ax, &h7100 ; Ab MS-DOS 7 bedeutet hier ein ! jz NoLFN ; Wert von &h7100: Use DOS 8.3 ! mov Dummy%, 1 ; functions! NoLFN: LFNSupport% = Dummy% END FUNCTION