Qbasicnews.com

Full Version: Save and check for files?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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.
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.
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.