All the Storage and Stream
related objects use common flags where it is possible. Also all the default values for the
optional parameters are the same for all the methods.
The flags are supported by Open/Create methods. This concerns the SFMain
(OpenFile, CreateFile, OpenDirectory, CreateDirectory, OpenStorageFile
etc.), SFStorage (OpenStoage, CreateStorage, OpenStream etc.), SFFileStream
and SFDirStorage.
Whenever SF_Flags are required the following table applies:
Flag name |
Flag value |
Meaning |
Open/create mode
flags |
cSFRead |
&H00000000 |
read only mode for the
stream/storage |
cSFWrite |
&H00000001 |
write only mode |
cSFReadWrite |
&H00000002 |
read/write mode |
Sharing |
cSFShareDenyNone |
&H00000040 |
The stream/storage is fully
shared - can be opened by other applications in any mode |
cSFShareDenyRead |
&H00000030 |
Read is forbidden for the other
applications. |
cSFShareDenyWrite |
&H00000020 |
Write is forbidden for the
other applications. |
cSFShareExclusive |
&H00000010 |
Other applications will receive
an error if any attempt is made to open the same object
(storage/stream/file/directory etc.) |
cSFSharePriority |
&H00040000 |
OLE Files only - commit
operations of the other applications will not occur until the
object is opened in priority mode. |
Creation specific
(Can be used in CreateXXX methods) |
cSFCreate |
&H00001000 |
If the stream/file/storage
exists it will be deleted and a new one will be created |
cSFConvert |
&H00020000 |
Supported by some storage
implementations only (OLE files for example) convert the file to
a part of the storage (see MSDN for more details - see STGM
enumeration). |
cSFFailIfThere |
&H00000000 |
Creation will fail if the
object already exists. |
Transactioning (if
supported - OLE Files) |
These flags are
rarely useful for scripting applications. For information on the
transaction control flags see MSDN (STGM enumeration). |
In all the methods where SF_Flags are expected they are optional.
If omitted the default value used is &H12 (0x12) which
means: open exclusive for read and write. Please
note that exclusive access is default! If you need more than
one applications/pages to share the same resource you will need to
specify flags explicitly or share one single SFStorage/SFStream object
between the applications.
Sharing techniques
In general there are two ways to implement resource
(file/storage/stream) sharing in the applications:
- By using appropriate flags.
- Or by sharing one SFStorage or SFStream object attached to the
resource between the applications.
The first technique is always applicable but depends on the
implementation of the sharing mechanisms in the OS or the custom
objects that manage the resource (s). It is quite good technique for
files and OLE storages, but can be inefficient for some applications.
This technique will require code to handle the read/write errors
caused by sharing violations.
The second technique serializes all the operations through the SF
object and thus always guarantees that only one operation with the
resource will be in progress at a time. However it is suitable only
for environments where objects can be easilly passed between the
applications. For example this is quite simple in ASP (using
Application). The free threaded version of the component is
recommended.
Note for ASP developers. While in IIS you have only one instance of
the ASP engine in ALP the user is able to start several separate
copies of the application running in isolated processes. If they use
the same resource through SF objects the second instance (and any
subsequent instances) of the application may be unable to access it if
it is already opened by the first running instance in exclusive mode.
However preventing the subsequent instances from accessing the
resource can be a good way to guarantee the resource consistency. To
inform user put some error handling code in the initialization part of
the application to inform him/her that the resource is locked by other
application/instance of the same app. and he/she should work with it
instead of starting a new copy. |