Santronics Software Inc.,
wcBASIC Open Statement
The wcBASIC OPEN command supports the following syntax:

As a COMMAND (you set the filenum)

  OPEN file FOR mode
              [ACCESS access]           <-- Access Restriction
              [lock]                    <-- Lock Type
              AS [#]filenum
              [LEN = reclen]            <-- for mode random/binary

As a FUNCTION (return file name), Recommended method.

  filenum = OPEN file FOR mode
              [ACCESS access]           <-- Access Restriction
              [lock]                    <-- Lock Type
              [LEN = reclen]            <-- for mode random/binary


The Open statement syntax has these parts:

  Part     Description
  -----    --------------
  file     Required: The file name (in DOS or WC:\ format) to open

  mode     Required: Keyword specifying the file mode:

           Append      open existing or new file to append
           Input       open existing for reading only
           Output      open new file for writing only
           Binary      open file for reading/writing (stream)
           Random      open file for reading/writing (records)

  access   Optional. Keyword specifying the operations permitted on
           the  open file by the owner process

           Read        file is open for reading only
           Write       file is open for writing only
           Read Write  file is open for reading/writing

  lock     Optional. Keyword specifying the operations restricted on
           the open file by other processes:

           Shared
           Lock Read
           Lock Write
           Lock Read Write

  filenum  file number to assign to the file. If the AS clause is
           omitted, then this statement works like a function
           and returns a file number. This saves you from having to
           know which file number(s) are available, or using
           FreeFile to pick a free file number.

  reclen   Optional. length of a record in a sequential or
           random-access file, in the range 1 through 32767. For
           files opened for random access, this value is the record
           length.

o Notes:

  Text files are made up of Strings and numeric data, with carriage
  return and line feed characters added as they are written to the
  file. Text files are often called sequential files as the data is
  always added sequentially.

  The Output mode will create a new file whether it exists or not.
  It does not warn you if you are be about to overwrite an existing
  file. The Output mode will open the file for String or numeric
  data output using the Print statement.

  The Append mode will create a new file if one does not exist or
  prepare the existing file by positioning the file pointer at the
  end. The Append mode will open the file for String or numeric data
  output using the Print statement.

  The Input mode will open the file to input String or numeric
  data by using the Input statement.  The file is existed to exist.

  Binary files are files with a record length of one byte (streams).
  Binary files are accessed either randomly or sequentially in one
  byte increments. A byte can be any value in the range 0 through
  255.

  Random access files have a record length defined in the data type
  declared in your program. Use the Len(Type) statement to report the
  actual size - this is easier than trying to calculate it.

  A Random file's data must always be read by using the Get statement
  with the exact same record structure that was used to Put the data
  there in the first place.

o Command vs Function Mode:

  The key difference is Error Handing. When command mode is used, an
  CATCH is required to trap any errors.  As a function, you check the
  returned file number.


  Example of command mode:

    open "somefile.txt" for input as #1

    ..... file is open ....

    close #1
    end

    catch ERR_FILEOPEN
      print "Error opening file"
      end

  Example of function mode:

    dim h as integer
    h = open "somefile.txt" for input
    if (h <= 0) then
      ..... file is open ....
      close(h)
    else
      print "Error opening file"
      end
    end if

o Examples:

Open file streaming byte I/O in shared READ mode only.

   // testfileio-ex1.wcc

   dim h as integer
   h = open "wc:\data\somefile.txt" for binary access read lock write
   if (h > 0) then
      do while not eof(h)
         dim b as byte
         get #h, , b
         print "[";right(hex(b),2);"] ";
         if b >= 32 then print b;
         print
      loop
      close(h)
   else
      print "Error ";hex(GetLastError());" opening file"
   end if

Here is an example using random access records:

   // testfileio-ex3.wcc

   #include "windows.wch"
   #include "htmlutil.wch"
   #include "util.wch"

   function myOpenData(fn as string,     \
                       rlen as integer,  \
                       w as integer      \
                       ) as integer
      myOpenData = 0
      dim h as integer
      dim err as integer
      dim e1 as integer = GetTickCount()
      do
         h = open fn for random lock write len = rlen
         err = GetLastError()
         if (h > 0) or (w <= 0) then
            exit do
         end if
         if (err <> 32) then
            exit do
         end if
         dim secs as integer = (GetTickCount()-e1)/1000
         if (secs > w) then
            // timeout waiting to open file
            exit do
         end if
         //
         print "- file locked... waiting..."
         UpdateScreen()
         //
         Sleep(200)
      loop
      myOpenData = h
      SetLastError(err)
   end function

   //----------------------------------------------------
   // MAIN
   //----------------------------------------------------
   cls
   updatescreen()

   type TMyData
     status as integer
     f1 as string*255
     f2 as string*255
   end type

   dim cmd  as string  = getparamstr(paramstr(1),"cmd","put")
   dim rpos as integer = getparamint(paramstr(1),"rpos",0)
   dim f1   as string  = getparamstr(paramstr(1),"f1","")
   dim f2   as string  = getparamstr(paramstr(1),"f2","")

   dim data as tmydata
   dim h as integer
   dim fn as string = "wc:\data\testfileio-ex3-records.dat"
   h = myOpenData(fn, sizeof(TMyData), 10)
   if (h > 0) then
      dim nrecs as integer = lof(h)
      print "# of recs: ";nrecs
      select case(lcase(cmd))
        case "put":
            print "Putting.... rec: ";rpos
            clear data
            data.status = rpos
            data.f1 = f1
            data.f2 = f2
            Put #h,rpos,data
        case "get":
            print "Getting.... rec: ";rpos
            clear data
            Get #h,rpos,data
            print "status: ";data.status
            print "f1    : ";data.f1
            print "f2    : ";data.f2
        end select
      WaitEnter()
      close(h)
   else
      print "Error ";hex(GetLastError());" opening file"
   end if

How to test this example

Test #1 - Testing File Locking during PUT process

Open two DOS windows and switch to the WC folder in each, then type:

Window #1

   wcrun -r testfileio-ex3.wcx "cmd=put&rpos=10&f1=field1&f2=field2"

Window #2

   wcrun -r testfileio-ex3.wcx "cmd=get&rpos=10"

In Window #2, you will see it waiting for 10 seconds to open the file.
Just wait and you will see it finally error out.

Repeat the command in Window #2 and before it times out, go to Window #1
and press ENTER.  You will see the process in Window #2 finally
complete.