Updated: 11 December 1998 |
Guide to OpenVMS File Applications
Previous | Contents | Index |
Rooted-directory syntax provides a way of making a directory or subdirectory appear to the user as the master file directory (MFD) for the logical disk volume. Subdirectories of the rooted directory appear as top-level directories (user file directories) for the logical volume.
The directory specified during logical name definition serves as a base from which directories beneath it can be accessed and is called the root directory. Root directories must be specified using alphanumeric UICs; octal numbering for group and member designations is not allowed.
A concealed-device logical name that defines a hidden root directory is called a rooted-device logical name.
When you define the rooted-device logical name for use in a program in a SET DEFAULT command, you specify that the logical name is a concealed-device logical name by using the /TRANSLATION_ATTRIBUTES=CONCEALED qualifier with the DCL command DEFINE or ASSIGN. To define the concealed-device logical name as a rooted-device logical name, the root directory must contain a trailing period (.), such as DUA22:[ROOT.]. When specifying a directory, you can only use a trailing period for the root directory.
When you define a root directory, all directory references refer to the specified root directory or directories beneath it in the directory tree. A reference to a top-level directory refers to a subdirectory of the specified root directory when using rooted-directory syntax. This is consistent with the fact that the root directory appears as the MFD because a reference to directory [000000] refers to the root directory. When you execute the SHOW DEFAULT and other direct commands, the system displays the root directory as [000000]. Note that the directory specification form [0,0] for the MFD is not valid when using rooted-directory syntax.
For example, assume the top-level directory [ROOT1] on disk DUA7 contains a subdirectory [ROOT1.SUB]. The directory [ROOT1] is defined as the root directory associated with the logical name BASE as follows:
$ DEFINE BASE DUA7:[ROOT1.] |
When you associate the root directory with the logical name base, you can refer to the logical top level directory [ROOT1.SUB] using the syntax BASE:[SUB]. The following chart provides a summary of the actual directory accessed and the equivalent rooted-directory syntax that applies to this example:
Actual Directory | Rooted Syntax | Comments |
---|---|---|
DUA7:[ROOT1] | BASE:[000000] | [ROOT1] appears as the MFD |
DUA7:[ROOT1.SUB] | BASE:[SUB] | [ROOT1.SUB] appears as a top-level directory |
The next example shows how to define the root logical name described in the previous chart and how to access a subdirectory of the specified root directory. Note that the trailing period [ROOT1.] indicates that a root directory is present.
$ DEFINE/TRANSLATION_ATTR=CONCEALED BASE DUA7:[ROOT1.] $ SET DEFAULT BASE:[SUB] $ DIRECTORY *.DIR,[-]*.DIR |
BASE:[SUB] SUBSUB.DIR BASE:[000000] SUB.DIR |
When it concatenates specifications for rooted directories, RMS uses different syntax rules than it uses when it concatenates directory specifications for normal directory syntax.
One difference between the two conventions is associated with the trailing period in the root directory definition. For example, consider how a top-level directory reference is handled. With rooted-directory syntax, the root directory's trailing period is implied as a leading period in subsequent rooted-directory references.
Directory concatenation within the same file specification occurs only with a rooted-device logical name. Normal directory concatenation occurs only through the application of defaults. Rooted-directory concatenation can occur within the same file specification and through the application of defaults. Rooted-device logical names specify a device name and a root directory. RMS translates a rooted-device logical name into the device and root directory before it merges any other parts of a file specification (if present) into the equivalence file specification.
When you use a rooted-device logical name together with a directory specification, the following rules apply:
$ DEFINE/TRANSLATION_ATTR=CONCEALED BASE DUA7:[ROOT1.] $ SET DEFAULT BASE:[000000] $ DIRECTORY *.DIR |
BASE:[000000] No files found |
$ DIRECTORY [-]*.DIR |
%DIRECT-E-OPENING, error opening [-]*.DIR as input -RMS-E-DIR, error in directory name |
$ DEFINE BASE DUA7:[ROOT1.] $ SET DEFAULT BASE:[SUBDIR] |
$ DEFINE/TRANSLATION_ATTR=CONCEALED BASE DUA7:[ROOT1.] $ DIR BASE:[*...]*.DIR |
BASE:[SUBDIR] SUBSUBDIR.DIR BASE:[SUBDIR.SUBSUBDIR] SUBSUBSUBDIR.DIR BASE:[OTHERSUB] OTHERSUBSUB.DIR |
Another difference between the conventions RMS uses for rooted-directory syntax and standard directory syntax is the number of permissible nested directory levels. With rooted-directory logical names you can hide eight additional levels in the rooted-directory logical name and effectively nest 16 levels of directories.
Note that you must access these files using the rooted-directory logical name and that the system rejects any attempt to access these files using normal directory syntax. For example, you can legally define the rooted-directory logical name MYROOT to be DUA0:[D1.D2.D3.D4.D5.D6 .] and nest six subdirectories beneath it using the following directory syntax:
MYROOT:[D7.D8.D9.D10.D11.D12]name.type |
But if you try to access this file using the following directory syntax, RMS returns a status code indicating the file specification is illegal:
DUA0:[D1.D2.D3.D4.D5.D6.D7.D8.D9.D10.D11.D12]name.type |
Another problem occurs when you try to back up the directory tree using conventional directory syntax, because the Backup utility only backs up the first eight levels of the directory tree.
This problem does not occur when you back up an entire disk at one time, that is, if you are using the BACKUP/IMAGE command or the BACKUP/PHYSICAL command. |
With rooted-directory syntax, RMS uses the process-default device and directory indirectly as defaults. This occurs because RMS uses the expanded rooted-device logical name device and root directory before applying the process-default device and directory.
With rooted-directory syntax, you can use relative directory syntax, such as the hyphen (-) and leading period (.name). When a directory component is missing, RMS attempts to obtain the missing components from the process-default directory.
Consider the rooted-device logical name X defined as shown in the following DCL command:
$ DEFINE X DJB3:[SMITH.] |
Now assume you set the default directory to JONES:
$ SET DEFAULT [JONES] |
The following table lists the file specifications involving the rooted-device logical name X and the directory that is accessed with each specification:
File Specification | Directories Accessed |
---|---|
X: | [SMITH.JONES] |
X:[000000] | Root directory, [SMITH.] |
X:[] | [SMITH.JONES] |
X:[-] | Root directory [SMITH.], listed as X:[000000] |
X:[- -] | Invalid (error) |
X:[name] | [SMITH.name] |
X:[.name] | [SMITH.JONES.name] |
X:[name.*...] | All directories in all directory trees below [SMITH.name] |
X:[*] | All directories one level below [SMITH.] |
X:[*...] | All directories in all directory trees below [SMITH.] |
X:[...] | All directories in all directory trees below [SMITH.JONES] |
Note that RMS uses the default directory with relative directory
references when the specified directory name contains a leading period
or a hyphen, or if no directory name is specified.
6.3.5 An Example of Using a Rooted Directory
Consider an application made up of several programs that refer to the same file using a file specification IN:[INVENTORY]FILE.DAT. Assume that all of the programs invoke the following command procedure to define the logical name IN as device DUA29:
$ ON CONTROL_Y THEN GOTO ENDIT $ DEFINE IN DUA29: $ RUN XYZPROG $ ENDIT: $ EXIT |
The programs show the current inventory level and the stockroom used for a particular item and are dispersed among many users in the company. As the business grows, the number of items in the inventory grows and the number of inventory records makes the file extremely large and difficult to access. Because the items can be classified as belonging to one of four groups, the data management department decides to split the file into four parts. A special-purpose program reads each record in the master file, determines the record type, and routes the record to the appropriate file group. All output files are named FILE.DAT, but each is distinguished by putting it in a top-level directory associated with the appropriate group category. For example, computer supplies files are cataloged in the directory [COMPUTER.INVENTORY].
This is done by modifying the command procedure to conditionally define the value of IN to be a rooted-device logical name with four subdirectories. The modified command procedure is shown in Example 6-1.
Example 6-1 Rooted-Directory Syntax |
---|
$ ON CONTROL_Y THEN GOTO END $ GOTO ASK $ RETRY: $ WRITE SYS$OUTPUT "Enter a number from 1 to 4 for the type of part" $ ASK: $ WRITE SYS$OUTPUT - "Select Parts Group: 1-COMPUTER 2-TYPEWRITER 3-DESK 4-OTHER 5-END" $ INQUIRE ANS $ IF ANS .GT. 5 .OR. ANS .LT. 1 THEN GOTO RETRY $ IF ANS .EQ. 5 THEN EXIT $ IF ANS .EQ. 1 THEN DEFINE/TRANS=CONCEAL IN DUA29:[COMPUTER.] $ IF ANS .EQ. 2 THEN DEFINE/TRANS=CONCEAL IN DUA29:[TYPEWRITER.] $ IF ANS .EQ. 3 THEN DEFINE/TRANS=CONCEAL IN DUA29:[DESK.] $ IF ANS .EQ. 4 THEN DEFINE/TRANS=CONCEAL IN DUA29:[OTHER.] $ RUN XYZPROG $ END: $ EXIT |
To support Extended File Specifications, RMS's user interface was extended to include capacities for the larger specifications that are sometimes necessary to access ODS-5-named files. (See the OpenVMS Record Management Services Reference Manual.) To take full advantage of all of the new features, applications would have to be updated to use the interface extensions. To provide extended capabilities (such as access to deep directories) to applications that continue to use the older interface, RMS supports the generation and acceptance of file specifications with an abbreviated form of root or directory specification, known as a DID (for Directory ID) abbreviation.
The DID abbreviation is used in file specifications and should not be confused with the numeric DID field of the NAM block. |
The DID is an alternate form of subdirectory specification that is not relative to the MFD. It takes the form (for ODS-2 and ODS-5 disks) of three decimal numbers separated by commas and can be used in the MFD position in a root or directory component specification.
Examples of valid root and directory components with DIDs are as follow:
DKA200:[24,42,0] DKA200:[1223,4,0.a] DKA200:[134,59,0...] DKA200:[1223,4,0.][134,59,0] |
A DID can also be used in place of a subdirectory in a root or directory component, but subdirectories located to its left in the specification (above it in the directory tree) are elided by RMS, as shown in the following example:
$SET PROCESS/PARSE_STYLE=EXTENDED $WRITE SYS$OUTPUT F$PARSE("DKA200:[system.test.134,59,0...]*.*;*") DKA200:[134,59,0...]*.*;* $WRITE SYS$OUTPUT F$PARSE("DKA200:[system.test.134,59,0.BTEST2]*.*;*") DKA200:[134,59,0.BTEST2]*.*;* |
If a specification contains both a root with a DID and a directory with a DID, the root will be ignored (though not elided) by RMS.
The directory ID numbers are those that are displayed for a directory with the DIRECTORY/FILE_ID DCL command, as shown in the following:
$DIRECTORY/FILE_ID/NOHEADER/NOTRAILING/WIDTH=(FILE=45) .DIR;1 DKA200:[SYSTEM]1.DIR;1 (24,42,0) DKA200:[SYSTEM]a.DIR;1 (1223,4,0) DKA200:[SYSTEM]BTEST1.DIR;1 (134,59,0) DKA200:[SYSTEM]DIR^^_1.DIR;1 (609,22,0) DKA200:[SYSTEM]lowercase.DIR;1 (655,49,0) DKA200:[SYSTEM]te^[mp.DIR;1 (20,37,0) DKA200:[SYSTEM]tmp^.tmp.DIR;1 (355,20,0) DKA200:[SYSTEM]UNICODE.DIR;1 (1968,10,0) DKA200:[SYSTEM]UPPERCASE.DIR;1 (656,45,0) DKA200:[SYSTEM]with^.dot.DIR;1 (768,28,0) |
When RMS attempts to generate a file specification that is too long for the application's output buffer, pointed to by the NAM block expanded or resultant string field, NAM$L_ESA or NAM$L_RSA; or by the NAML block short expanded or short resultant string file, NAML$L_ESA or NAML$L_RSA, it replaces the root and directory component with one that has the DID for the lowest level subdirectory of the replaced component(s). The specification that results can then be used as input to RMS.
It should be noted that not all RMS features are available with DIDs.
For example, attempts to use sticky defaulting with a root or directory
with a DID will result in an error. And you cannot create a directory
using a DID.
6.5 FID-Abbreviated Names (Alpha Only)
On Alpha systems, when a file specification, even with DID abbreviation, is too long to fit into a resultant name buffer (NAM block NAM$L_RSA field or NAML block NAML$L_RSA field), RMS attempts to generate a short-enough file specification by identifying the file with its file ID (three decimal numbers separated by commas, surrounded by brackets) in the file name component.
In cases in which the file type component would otherwise be presented, a generated file specification will either include the entire type or will not include any type (including the "." delimiter), depending upon whether or not there is space.
In cases in which the version component would otherwise be presented, a generated file specification will include the version component.
As a human-readable aid in recognizing files, when a FID is generated, the name component also contains a DCL-legal initial subset of the actual file name. The subset consists of the first 38 simple characters (where "^U1234" is six simple characters) of the actual file name, followed by "~".
No attempt is made to resolve ambiguities for files that differ only after the first 38 simple characters of their names.
An example of a generated name with a FID is as follows:
DKA200:[SYSTEM]leadingfilenamechars~[384,35200,0].txt;1 |
Such a file specification can be used as input to RMS, with some
limitations.
6.5.1 Restrictions on FID-Abbreviated Names
A FID can be used for input to RMS, but only the FID is significant. The subset portion of the name component, the type component, and the version component are ignored by RMS.
As input, the FID-abbreviated file name component is not used as a default (as from a related file specification to replace a wildcard in an output specification). Instead, the output specification will get a null file name, as shown in the following:
$COPY/LOG ^U6666^U7777^U8888^U9999^U5555^U6666~[449,35295,0].txt;1 *.xxx %COPY-S-COPIED, DKA200:[SYSTEM]^U6666^U7777^U8888^U9999^U5555^U6666~ [449,35295,0].txt;1 copied to DKA200:[SYSTEM].xxx;1 |
Note that generated names with FIDs are possible only for resultant
specifications, which refer to specific files, and not for expanded
specifications, which do not necessarily refer to one file.
6.6 Using Process-Permanent Files
Process-permanent files are files that remain open independent of image activation and rundown. Process-permanent files are created by setting the process-permanent file bit (FAB$V_PPF) in the file-processing options field (FAB$L_FOP). When the bit is set, RMS-maintained internal data structures are allocated in the process control region of memory for the life of the process. Thus, process-permanent files can remain open across image activations. SYS$COMMAND, SYS$INPUT, SYS$OUTPUT, and SYS$ERROR are all opened in this manner by the LOGINOUT command image.
The DCL command OPEN also opens files in this manner. With user mode code, you can access process-permanent files only indirectly. RMS provides a subset of the total available operations to the indirect accessor.
Indirect accessors gain access to process-permanent files through the logical name mechanism, as follows:
The implications for the indirect accessor are described in the following list:
Previous | Next | Contents | Index |
Copyright © Compaq Computer Corporation 1998. All rights reserved. Legal |
4506PRO_018.HTML
|