Posts: 1
Threads: 1
Joined: Aug 2004
Is there any way to save a file, but first check if there is another file with the same name in that directory? I also want to do it with directories. I know how to save files with
OPEN ~~~~ for INPUT and all that, but I don't kow how to check.
Posts: 2,771
Threads: 96
Joined: Oct 2003
There certainly is - First, open the file in BINARY mode. Then check the length of the file using LOF. If the file length is larger than 0, then the file exists. If the length is 0, then you can delete the file, because BINARY automatically creates a file if you try open one that doesnt exist.
I'm not sure about directories, that may be a bit more complicated. Ask Plasma about that.
Posts: 1,752
Threads: 21
Joined: Jun 2002
For QuickBASIC:
Code: ' DIR$ replacement by Plasma
' QuickBASIC 4.x version
' Remember to start QB with the /L switch: QB /L
DEFINT A-Z
'$INCLUDE: 'QB.BI'
DECLARE FUNCTION DIR2$ (FileSpec$, Attr)
CONST ANYDIR = &H10
CONST ANYFILE = &H27
' Examples:
' To check for the existence of a file:
' IF LEN(DIR2$("C:\AUTOEXEC.BAT", ANYFILE)) THEN
' PRINT "The file exists"
' ELSE
' PRINT "The file does not exist"
' END IF
' To check for the existence of a directory:
' IF LEN(DIR2$("C:\WINDOWS", ANYDIR)) THEN
' PRINT "The directory exists"
' ELSE
' PRINT "The directory does not exist"
' END IF
' To generate a list of files:
'
' n$ = DIR2$("C:\*.*", ANYFILE)
' DO WHILE LEN(n$)
' PRINT n$
' n$ = DIR2$("", ANYFILE)
' LOOP
' To generate a list of directories:
'
' n$ = DIR2$("C:\*.*", ANYDIR)
' DO WHILE LEN(n$)
' PRINT n$
' n$ = DIR2$("", ANYDIR)
' LOOP
FUNCTION DIR2$ (FileSpec$, Attr) STATIC
'==========================================================================
' DIR$ replacement by Plasma (1.1)
'--------------------------------------------------------------------------
' Settings for Attr: (may be combined)
'
' &H40 Device
' &H20 Archive
' &H10 Directory
' &H8 Volume Label
' &H4 System File
' &H2 Hidden File
' &H1 Read-Only File
'==========================================================================
DIM DTA AS STRING * 44
FileSpecZ$ = FileSpec$ + CHR$(0)
DO
DIM Regs AS RegTypeX
Regs.ax = &H1A00
Regs.ds = VARSEG(DTA)
Regs.dx = VARPTR(DTA)
InterruptX &H21, Regs, Regs
IF FileSpecZ$ <> CHR$(0) THEN
Regs.ax = &H4E00
Regs.cx = Attr
Regs.ds = VARSEG(FileSpecZ$)
Regs.dx = SADD(FileSpecZ$)
ELSE
Regs.ax = &H4F00
END IF
InterruptX &H21, Regs, Regs
IF Regs.flags AND 1 THEN
DIR2$ = ""
EXIT FUNCTION
ELSE
RealAttr = ASC(MID$(DTA, 22, 1))
IF RealAttr AND Attr THEN
IF Attr > &H27 AND NOT RealAttr AND &H10 THEN
FileSpecZ$ = CHR$(0)
ELSE
Null = INSTR(31, DTA, CHR$(0))
DIR2$ = MID$(DTA, 31, Null - 31)
EXIT FUNCTION
END IF
ELSE
FileSpecZ$ = CHR$(0)
END IF
END IF
LOOP
END FUNCTION
For QBASIC:
Code: ' DIR$ replacement by Plasma
' QBASIC version
DEFINT A-Z
DECLARE FUNCTION DIR2$ (FileSpec$, Attr)
DECLARE SUB IntX (IntNum, InReg AS ANY, OutReg AS ANY)
TYPE RegTypeX
ax AS INTEGER
bx AS INTEGER
cx AS INTEGER
dx AS INTEGER
bp AS INTEGER
si AS INTEGER
di AS INTEGER
flags AS INTEGER
ds AS INTEGER
es AS INTEGER
END TYPE
CONST ANYDIR = &H10
CONST ANYFILE = &H27
' Examples:
' To check for the existence of a file:
' IF LEN(DIR2$("C:\AUTOEXEC.BAT", ANYFILE)) THEN
' PRINT "The file exists"
' ELSE
' PRINT "The file does not exist"
' END IF
' To check for the existence of a directory:
' IF LEN(DIR2$("C:\WINDOWS", ANYDIR)) THEN
' PRINT "The directory exists"
' ELSE
' PRINT "The directory does not exist"
' END IF
' To generate a list of files:
'
' n$ = DIR2$("C:\*.*", ANYFILE)
' DO WHILE LEN(n$)
' PRINT n$
' n$ = DIR2$("", ANYFILE)
' LOOP
' To generate a list of directories:
'
' n$ = DIR2$("C:\*.*", ANYDIR)
' DO WHILE LEN(n$)
' PRINT n$
' n$ = DIR2$("", ANYDIR)
' LOOP
FUNCTION DIR2$ (FileSpec$, Attr) STATIC
'==========================================================================
' DIR$ replacement by Plasma (1.1)
'--------------------------------------------------------------------------
' Settings for Attr: (may be combined)
'
' &H40 Device
' &H20 Archive
' &H10 Directory
' &H8 Volume Label
' &H4 System File
' &H2 Hidden File
' &H1 Read-Only File
'==========================================================================
DIM DTA AS STRING * 44
FileSpecZ$ = FileSpec$ + CHR$(0)
DO
DIM Regs AS RegTypeX
Regs.ax = &H1A00
Regs.ds = VARSEG(DTA)
Regs.dx = VARPTR(DTA)
IntX &H21, Regs, Regs
IF FileSpecZ$ <> CHR$(0) THEN
Regs.ax = &H4E00
Regs.cx = Attr
Regs.ds = VARSEG(FileSpecZ$)
Regs.dx = SADD(FileSpecZ$)
ELSE
Regs.ax = &H4F00
END IF
IntX &H21, Regs, Regs
IF Regs.flags AND 1 THEN
DIR2$ = ""
EXIT FUNCTION
ELSE
RealAttr = ASC(MID$(DTA, 22, 1))
IF RealAttr AND Attr THEN
IF Attr > &H27 AND NOT RealAttr AND &H10 THEN
FileSpecZ$ = CHR$(0)
ELSE
Null = INSTR(31, DTA, CHR$(0))
DIR2$ = MID$(DTA, 31, Null - 31)
EXIT FUNCTION
END IF
ELSE
FileSpecZ$ = CHR$(0)
END IF
END IF
LOOP
END FUNCTION
SUB IntX (IntNum, InReg AS RegTypeX, OutReg AS RegTypeX)
'==========================================================================
' IntX 1.0 by Plasma (4/29/2004)
' Use interrupts without CALL INTERRUPT or CALL ABSOLUTE
'==========================================================================
STATIC Version, VarptrSeg&, VarptrOff, IntAsm(), IntOff
IF VarptrSeg& = 0 THEN
DefSeg& = VARSEG(DefSeg$)
VarptrSeg& = DefSeg& - &H400
DO WHILE VarptrSeg& > 0
DEF SEG = VarptrSeg&
FOR i = &H9 TO &H3FF3
IF PEEK(i) = &H87 AND PEEK(i + 1) = &HDA AND PEEK(i + 2) = &H8B THEN
IF PEEK(i + 3) = &H46 AND PEEK(i + 4) = &H6 AND PEEK(i + 5) = &H88 THEN
IF PEEK(i + 6) = &H7 AND PEEK(i + 7) = &H8B AND PEEK(i + 8) = &H46 THEN
IF PEEK(i + 9) = &H8 AND PEEK(i + 10) = &H89 AND PEEK(i + 11) = &H47 THEN
IF PEEK(i + 12) = &H1 AND PEEK(i + 13) = &H92 THEN
VarptrOff = i - 9
Version = 45
EXIT DO
END IF
END IF
END IF
END IF
ELSEIF PEEK(i) = &HB9 AND PEEK(i + 1) = &H3 AND PEEK(i + 2) = &H0 THEN
IF PEEK(i + 6) = &H8D AND PEEK(i + 7) = &H76 AND PEEK(i + 8) = &H6 THEN
IF PEEK(i + 9) = &HA4 AND PEEK(i + 10) = &H46 AND PEEK(i + 11) = &HA5 THEN
VarptrOff = i + 12
Version = 71
EXIT DO
END IF
END IF
END IF
NEXT
VarptrSeg& = VarptrSeg& - &H3F0
LOOP
IF i = &H3FF4 THEN
VarptrSeg& = 0
EXIT SUB
END IF
IntAsm$ = "8E1F1E8B060E0050A100008B1E02008B0E04008B1606008B2E08008B360A"
IntAsm$ = IntAsm$ + "008B3E0C008E0612008E1E10009DCD001E53506658665B9C66"
IntAsm$ = IntAsm$ + "C1CB108EDB66C1EB10891E1000A3000066C1E8108906020089"
IntAsm$ = IntAsm$ + "0E040089160600892E080089360A00893E0C005889060E008C"
IntAsm$ = IntAsm$ + "0612009D071F61"
IF Version = 45 THEN
IntAsm$ = "5589E5601E069C8B5E08" + IntAsm$ + "5D31C0CA0400"
IntOff = 55
ELSE
IntAsm$ = "601E069C4F4F268B1D" + IntAsm$ + "5F5E5DCA0400"
IntOff = 54
END IF
DIM IntAsm(LEN(IntAsm$) / 4)
DEF SEG = VARSEG(IntAsm(0))
FOR i = 1 TO LEN(IntAsm$) STEP 2
POKE (i - 1) / 2, VAL("&H" + MID$(IntAsm$, i, 2))
NEXT
END IF
DEF SEG = VarptrSeg&
POKE VarptrOff + 0, &HEA
POKE VarptrOff + 1, 0
POKE VarptrOff + 2, 0
POKE VarptrOff + 3, VARSEG(IntAsm(0)) AND &HFF
POKE VarptrOff + 4, (VARSEG(IntAsm(0)) AND &HFF00&) \ &H100
DEF SEG = VARSEG(IntAsm(0))
POKE IntOff, IntNum
DIM Regs(10)
Regs(0) = InReg.ax
Regs(1) = InReg.bx
Regs(2) = InReg.cx
Regs(3) = InReg.dx
Regs(4) = InReg.bp
Regs(5) = InReg.si
Regs(6) = InReg.di
Regs(7) = InReg.flags
Regs(8) = InReg.ds
Regs(9) = InReg.es
RegSeg = VARSEG(Regs(0))
rc$ = VARPTR$(RegSeg)
OutReg.ax = Regs(0)
OutReg.bx = Regs(1)
OutReg.cx = Regs(2)
OutReg.dx = Regs(3)
OutReg.bp = Regs(4)
OutReg.si = Regs(5)
OutReg.di = Regs(6)
OutReg.flags = Regs(7)
OutReg.ds = Regs(8)
OutReg.es = Regs(9)
DEF SEG = VarptrSeg&
IF Version = 45 THEN
POKE VarptrOff + 0, &H55
POKE VarptrOff + 1, &H8B
POKE VarptrOff + 2, &HEC
POKE VarptrOff + 3, &HBB
POKE VarptrOff + 4, &H3
ELSE
POKE VarptrOff + 0, &H5F
POKE VarptrOff + 1, &H5E
POKE VarptrOff + 2, &H5D
POKE VarptrOff + 3, &HCA
POKE VarptrOff + 4, &H4
END IF
END SUB
To create a directory, use MKDIR. To remove a directory, use RMDIR.
|