Home > Class Reference > %SYS namespace > %Stream.FileBinary


stream class %Stream.FileBinary extends %Stream.Object

Stream class that stores binary data in files. For example the following code opens a file binary stream, points it at a particular file on the filesystem and then reads it in chunks of 32,000 bytes:
  Set stream=##class(%Stream.FileBinary).%New()
  Set sc=stream.LinkToFile("c:\myfile.txt")
  While 'stream.AtEnd {
  Set line=stream.Read()
  ; Process the chunk here

Property Inventory (Including Private)

Method Inventory (Including Private)


parameter FILEEXT = stream;
parameter GZIP = 0;
parameter OPENREAD = RUK\RAW\;
parameter OPENWRITE = WUNK\RAW\;
parameter STORAGE = OTHER;

Properties (Including Private)

property CanonicalFilename as %String (MAXLEN = 5000) [ Calculated ];
Read only property that returns the canonical filename if the file is open and "" if the file is not open. On VMS this will include the file version number
Property methods: CanonicalFilenameDisplayToLogical(), CanonicalFilenameGet(), CanonicalFilenameIsValid(), CanonicalFilenameLogicalToDisplay(), CanonicalFilenameLogicalToOdbc(), CanonicalFilenameNormalize()
property CurrFile as %String (MAXLEN = 5000) [ Private , Transient ];
Full path name of currently opened file. Equal to "" if no file is open.
Property methods: CurrFileDisplayToLogical(), CurrFileGet(), CurrFileIsValid(), CurrFileLogicalToDisplay(), CurrFileLogicalToOdbc(), CurrFileNormalize(), CurrFileSet()
property Filename as %String (MAXLEN = 5000) [ Calculated ];
The filename that this stream is currently using
Property methods: FilenameDisplayToLogical(), FilenameGet(), FilenameIsValid(), FilenameLogicalToDisplay(), FilenameLogicalToOdbc(), FilenameNormalize(), FilenameSet()
property LineTerminator as %String (MAXLEN = 10) [ InitialExpression = $get(^%SYS("Stream","LineTerminator"),$select($$$isUNIX:$char(10),1:$char(13,10))) , Transient ];
For file streams the line will terminate on any of the characters set in the LineTerminator, it does not support multi-character line terminators because it uses the Cache file behavior which terminates on any of the characters. Updating this in the middle of a file on VMS will rewind the file to the beginning because of the way files work on VMS.
Also for %FileCharacterStream even if you set this when you call WriteLine() as the file was opened in 'S' mode it will normalize the line terminator as the data is being written, so for example if you set LineTerminator to $char(13,10) on Unix systems when you call WriteLine() it will only write $char(10) to the file.
Property methods: LineTerminatorDisplayToLogical(), LineTerminatorGet(), LineTerminatorIsValid(), LineTerminatorLogicalToDisplay(), LineTerminatorLogicalToOdbc(), LineTerminatorNormalize(), LineTerminatorSet()
property MakePermLoc as %Boolean [ Private , InitialExpression = 0 , Transient ];
If true then when saving this file we need to move it to the default permanent location
Property methods: MakePermLocDisplayToLogical(), MakePermLocGet(), MakePermLocIsValid(), MakePermLocLogicalToDisplay(), MakePermLocNormalize(), MakePermLocSet()
property Mode as %Integer [ Private , InitialExpression = 0 ];
Property methods: ModeDisplayToLogical(), ModeGet(), ModeIsValid(), ModeLogicalToDisplay(), ModeNormalize(), ModeSet()
property NormalizedDirectory as %String (MAXLEN = 5000) [ Private ];
Normalized form of the directory. This is used for access to the file (as it adds the extra '/' if needed), but it stores the %Location in the Id as this may be a relative path.
Property methods: NormalizedDirectoryDisplayToLogical(), NormalizedDirectoryGet(), NormalizedDirectoryIsValid(), NormalizedDirectoryLogicalToDisplay(), NormalizedDirectoryLogicalToOdbc(), NormalizedDirectoryNormalize(), NormalizedDirectorySet()
property ReadMode as %Integer [ Private , InitialExpression = $$$modeREADNORMAL , Transient ];
Mode the device is opened in, either with terminators as delimitors or not.
Property methods: ReadModeDisplayToLogical(), ReadModeGet(), ReadModeIsValid(), ReadModeLogicalToDisplay(), ReadModeNormalize(), ReadModeSet()
property ReadSize as %Integer [ Transient ];
While reading this holds the file size
Property methods: ReadSizeDisplayToLogical(), ReadSizeGet(), ReadSizeIsValid(), ReadSizeLogicalToDisplay(), ReadSizeNormalize(), ReadSizeSet()
property RemoveOnClose as %Boolean [ InitialExpression = 0 , Transient ];
If true then remove the permanent file as well as any temp file when this object is closed. If you call %Save on a stream where RemoveOnClose is true it will set this to false as if you explicitly save the stream you no longer want it to be removed when the object is closed. In order to make sure %Save always runs the logic to reset the flag setting this to true causes %IsModified/%ObjectModified to return true.
Property methods: RemoveOnCloseDisplayToLogical(), RemoveOnCloseGet(), RemoveOnCloseIsValid(), RemoveOnCloseLogicalToDisplay(), RemoveOnCloseNormalize(), RemoveOnCloseSet()
property TempFile as %String (MAXLEN = 5000) [ Private , Transient ];
Name of file (without directory) containing temporary stream.
Property methods: TempFileDisplayToLogical(), TempFileGet(), TempFileIsValid(), TempFileLogicalToDisplay(), TempFileLogicalToOdbc(), TempFileNormalize(), TempFileSet()
property UseVMSVersion as %Boolean [ InitialExpression = 0 , Transient ];
If true then on VMS only do not delete the persistent file before replacing it with the new version. This will cause the new version to be written with a new version number and so will keep the old file version present.
Property methods: UseVMSVersionDisplayToLogical(), UseVMSVersionGet(), UseVMSVersionIsValid(), UseVMSVersionLogicalToDisplay(), UseVMSVersionNormalize(), UseVMSVersionSet()

Methods (Including Private)

private classmethod %DeleteData(streamvalue As %String, concurrency As %Integer) as %Status
classmethod %Exists(soid As %ObjectIdentity) as %Boolean
Inherited description: Checks to see if the object identified by the OID oid exists in the extent.

Returns %Boolean TRUE is it exists, FALSE if it does not.

method %IsModified() as %Integer
Inherited description: Returns true (1) if a property of this instance has been modified, otherwise false (0). A TRUE result does not necessarily mean that any property has actually been changed. If %IsModified() returns false then the object has not been modified. There are some situations where we simply cannot efficiently detect a change in value. In these cases we will set the modified status of the property.
method %IsNull() as %Boolean
Inherited description: Returns true if this is a "NULL" stream; that is, a stream which has never been written to and saved and has no stream attributes. This is used by the Caché ODBC server.
private method %LoadData(id As %String) as %Status
method %LocationSet(dir As %String) as %Status
Note that setting the %Location will cause a few things to happen. It will delete any temporary file that may have been created. It will not touch any permanent file that this object was associated with, if you wish to delete this pre-existing permanent file then call Clear() passing '1' as the argument before setting the %Location. It then marks this object as pointing to a null stream in the new directory you specified.
method %NormalizeObject() as %Status
Inherited description: Normalizes all of an object's property values by invoking the data type Normalize methods. Many data types may allow many different representations of the same value. Normalization converts a value to its cannonical, or normalized, form.
classmethod %ObjectIsNull(soid As %ObjectIdentity) as %Boolean
Inherited description: Return true if this stream oid is a null stream and false if the stream is not null
method %ObjectModified() as %Integer
Inherited description: This method is somewhat similar to %IsModified but it also checks to see if swizzled references would cause the object to become modified should they be serialized. This works on the assumption that a reference to a persistent object will never be modified if the ID has already been assigned. For references to serial objects, a call to %ObjectModified indicates whether or not the serialized value is different. If the reference to a swizzled object is different from the initial object state then the $$$objModAll macro will already return true. Reference the Set code. Returns true (1) if this instance has been modified, otherwise false (0).
private method %OnClose() as %Status
Inherited description: This callback method is invoked by the %Close() method to provide notification that the current object is being closed.

The return value of this method is ignored.

private method %OnConstructClone(object As %RegisteredObject, deep As %Boolean = 0, ByRef cloned As %String) as %Status
Inherited description: This callback method is invoked by the %ConstructClone() method to provide notification that a clone of an object is being created. It passes in the oref of the object that was cloned in object.

If this method returns an error then the object will not be created.

private method %OnNew(initval As %String = "") as %Status
Inherited description: This callback method is invoked by the %New() method to provide notification that a new instance of an object is being created.

If this method returns an error then the object will not be created.

It is passed the arguments provided in the %New call. When customizing this method, override the arguments with whatever variables and types you expect to receive from %New(). For example, if you're going to call %New, passing 2 arguments, %OnNew's signature could be:

Method %OnNew(dob as %Date = "", name as %Name = "") as %Status If instead of returning a %Status code this returns an oref and this oref is a subclass of the current class then this oref will be the one returned to the caller of %New method.

private method %SaveData(ByRef sid As %String) as %Status
method %ValidateObject(force As %Library.Integer = 0, checkserial As %Library.Boolean = 1) as %Status
Inherited description: This method validates an object. The %Save method of a persistent class calls it before filing any objects in the database. The %ValidateObject method of a referencing object can call it. You can also call it explicitly at any time.

%ValidateObject() does the following:

  1. It tests if any required property values are missing.
  2. If the PROPERTYVALIDATION class parameter is set to ValidateOnSave, it validates each non-null property value by calling the property method IsValid on each literal property and the object's %ValidateObject method for object-valued properties.
  3. If present, it will call a user-supplied %OnValidateObject() method.

If any of these tests fail, %ValidateObject() immediately returns an error value. It is up to the caller of %ValidateObject to process the error value.

Returns a %Status value indicating success or failure.

method CanonicalFilenameGet() as %String
method Clear(permanent As %Boolean = 1) as %Status
Inherited description: Clear the contents of this Stream from permanent storage. This will remove the permanent stream storage and any temporary stream and initialise the stream to its initial state that it starts in, including removing all the stream attributes.

Returns a %Status value indicating success or failure.

method CopyFrom(source As %AbstractStream) as %Status
Inherited description: Copies the contents of source into this Stream.

For example, you can copy oldstream into a new stream:

  Set newstream=##class(%GlobalCharacterStream).%New()
  Do newstream.CopyFrom(oldstream)

Returns a %Status value indicating success or failure.

classmethod DefaultStreamDir(skip As %Boolean = 0) as %String
Return the default directory to use for streams if none specified
method FileBinarySize() as %Integer
Return the current size of the file in bytes.
method FilenameGet() as %String
method FilenameSet(file As %String) as %Status
method Flush() as %Status
Inherited description: Flush any output in the stream not already saved.
private method GetWriteOpenParameter(filename As %String, mode As %Integer) as %String
method IdSet(id As %String) as %Status
method LastModifiedGet() as %TimeStamp
method LineTerminatorSet(terminator As %String) as %Status
method LinkToFile(filename As %String) as %Status
This method lets you connect a file stream to a file called filename without making a copy of it. If the file does not already exist it will still allow you to link to this file, and %IsNull() will return true until you write to this file.
  Do object.Image.LinkToFile("\temp\image.jpg")
  Do object.%Save()
The method as its name suggests creates a LINK to an EXISTING file. So this is a 'shared public' file, as it can be shared by several instances of a class, or even several classes. Using the CopyFrom() method, on the contrary, creates a 'private' image, not sharable by other instances/classes, so these two methods are really different.

The problems with shared public images are that several instances are all allowed to update and even delete the image, causing problems for other instances.

For example, if dog #2 has image 'test.gif', I can also assign that image to dog #5 or even person #24 If I change the image for dog #5, then the image is changed in place to another image, thus upsetting dog#2 and person#24. If I delete dog#5, the image is also deleted and thus dog#2 and person#24 are changed.

Also note that if there is currently some temporary data in the old stream when the LinkToFile() is called this temporary data will be removed before the stream is linked to this filename.

method MoveToEnd() as %Status
Inherited description: Move to the end of the stream so the next Write will be appended to the end. This allows you to read from a stream, then MoveToEnd() and append new data, where just calling Write() after a read will clear the stream before writing new data.

Returns a %Status value indicating success or failure.

classmethod NewFileName(ext As %String = "", directory As %String = "") as %String
private method OpenDevice(filename As %String, mode As %Integer, nocheck As %Boolean = 0) as %Status
method OutputToDevice(ByRef len As %Integer = -1) as %Status
Inherited description: Write out len characters of the stream to the current device starting from the current position. This method is optimised for performance by the various sub classes. If len is omitted or set to -1 then it will write out the entire stream starting at the beginning.
method Read(ByRef len As %Integer = 32000, ByRef sc As %Status) as %CacheString
Inherited description: Reads up to len characters from the current position in the stream. The current position is advanced by the number of characters read. Upon exit, len is set to the actual number of characters read. If a read occurs when the stream position is at the end of the stream, len will be set to -1 and Read() will return a null string (""). If no len is passed in, ie. 'Read()' then it is up to the Read implementation as to how much data to return. Some stream classes use this to optimize the amount of data returned to align this with the underlying storage of the stream.

You must call Rewind() if you want to read a stream from the beginning again. Calling Read() after Write() implicitly ends the Write() operation and rewinds to the start of the stream.

Returns a string up to len characters long. The byref argument sc will return a %Status if any error occurred during the read.

method ReadLine(ByRef len As %Integer = 32000, ByRef sc As %Status, ByRef eol As %Boolean, ByRef term As %String) as %CacheString
Read a line from the line. Note that besides the normal ReadLine arguments this can also be passed a term which will return the termintor that completed the line if we read in a whole line.
method ReadLineIntoStream(ByRef sc As %Status) as %AbstractStream
method Rewind() as %Status
Inherited description: Go back to the start of the stream.
private method SetupRead(newMode As %Integer) as %Status
method SizeGet() as %Integer
Return the current size of the data stream.
method Write(data As %Library.Binary = "") as %Status
Inherited description: Appends the string data to the stream and advances the current stream position by the number of characters in data.

Note that a write operation immediately following a read or rewind will clear out the existing data in the stream.

Returns a %Status value indicating success or failure.

method WriteLine(data As %Library.Binary = "") as %Status
Appends the string data along with a line terminator to the stream and advances the current stream position by the number of characters in data plus the line terminator.

Returns a %Status value indicating success or failure.

Inherited Members

Inherited Properties (Including Private)

Inherited Methods (Including Private)