Skip to main content

ファイルおよびディレクトリのプロパティと属性

%Library.FileOpens in a new tab クラスには、ファイルとディレクトリに関する情報の取得や、そのプロパティと属性の表示または設定に使用できるクラス・メソッドが多数用意されています。

Note:

ファイル名またはディレクトリ名の一部を指定すると、ほとんどのメソッドでは、作業中のネームスペースの既定のグローバル・データベースが含まれるディレクトリを基準とした項目を参照しているものと想定されます。このディレクトリをここでは "既定のディレクトリ" と呼びます。このルールが当てはまらない場合は注記しています。

また、これらのメソッドでファイル名とディレクトリ名の大文字と小文字が区別されるのは、基盤となるオペレーティング・システムでファイル名とディレクトリ名の大文字と小文字が区別される場合だけです。つまり、UNIX® ではファイル名またはディレクトリ名の大文字と小文字が区別されますが、Windows では区別されません。

ファイルとディレクトリの有無のチェック

指定したファイルが存在するかどうかを確認するには、Exists() メソッドを使用し、ファイル名を引数として指定します。例えば、以下のように指定します。

USER>write ##class(%File).Exists("C:\temp\test.html")
1

同様に、指定したディレクトリが存在するかどうかを確認するには、DirectoryExists() メソッドを使用し、ディレクトリを引数として指定します。例えば、以下のように指定します。

USER>write ##class(%File).DirectoryExists("C:\temp")
1

前述のとおり、これらのメソッドでも、Unix ではファイル名またはディレクトリ名の大文字と小文字が区別されますが、Windows では区別されません。また、ファイル名またはディレクトリ名の一部を指定すると、作業中のネームスペースの既定のグローバル・データベースが含まれるディレクトリを基準としたファイルまたはディレクトリを指しているものと想定されます。例えば、以下のようになります。

USER>write ##class(%File).Exists("iris.dat")
1

ファイルとディレクトリの許可の表示と設定

%Library.FileOpens in a new tab クラスには、ファイルまたはディレクトリの許可の表示または設定に使用できるクラス・メソッドが多数用意されています。

ファイルまたはディレクトリが読み取り専用か書き込み可能かの確認

ファイル名またはディレクトリ名を指定すると、ReadOnly() メソッドは、そのファイルまたはディレクトリが読み取り専用の場合は 1 を返し、そうでない場合は 0 を返します。

USER>write ##class(%File).ReadOnly("export.xml")
1
USER>write ##class(%File).ReadOnly("C:\temp")
0

同様に、ファイル名またはディレクトリ名を指定すると、Writeable() メソッドは、そのファイルまたはディレクトリが書き込み可能な場合は 1 を返し、そうでない場合は 0 を返します。

USER>write ##class(%File).Writeable("export.xml")
0
USER>write ##class(%File).Writeable("C:\temp")
1

ファイルまたはディレクトリを読み取り専用または書き込み可能にする方法 (Windows)

Windows 上のファイルまたはディレクトリを読み取り専用にするには、SetReadOnly() メソッドを使用します。このメソッドは、成功または失敗を示すブーリアン値を返します。このメソッドは 3 つの引数を取りますが、2 つ目は Windows では省略されます。1 つ目の引数は、ファイルまたはディレクトリの名前です。3 つ目の引数は、出力引数です。これが負の値の場合、メソッドが失敗したときにオペレーティング・システムから返されるエラー・コードが含まれます。

以下の例では、SetReadOnly() の呼び出しによって、ファイル C:\temp\testplan.pdf が正常に読み取り専用に変更されます。

USER>write ##class(%File).ReadOnly("C:\temp\testplan.pdf")
0
USER>write ##class(%File).SetReadOnly("C:\temp\testplan.pdf",,.return)
1
USER>write ##class(%File).ReadOnly("C:\temp\testplan.pdf")
1

以下の例では、SetReadOnly() の呼び出しが失敗し、"アクセスが拒否された" ことを示す Windows システム・エラー・コード 5 が返されます。

USER>write ##class(%File).SetReadOnly("C:\",,.return)
0
USER>write return
-5

Windows 上のファイルまたはディレクトリを書き込み可能にするには、SetWriteable() メソッドを使用します。このメソッドは同じ 3 つの引数を取りますが、同じようにその 2 つ目は Windows では省略されます。

USER>write ##class(%File).Writeable("export.xml")
0
USER>write ##class(%File).SetWriteable("export.xml",,.return)
1
USER>write ##class(%File).Writeable("export.xml")
1

ファイルまたはディレクトリを読み取り専用または書き込み可能にする方法 (Unix)

Unix でもメソッド SetReadOnly()SetWriteable() を使用できますが、2 つ目のパラメータがあることで動作が多少異なります。詳細は、"クラス・リファレンス" の "%Library.File.SetReadOnly()Opens in a new tab" または "%Library.File.SetWriteable()Opens in a new tab" を参照してください。

ただし、Unix では、所有者、グループ、およびユーザに異なる許可を指定できます。ファイルとディレクトリの許可のきめ細かい制御については、"ファイルとディレクトリの属性の表示と設定" を参照してください。

ファイルとディレクトリの属性の表示と設定

より詳細なレベルでファイルまたはディレクトリの属性を表示または設定するには、%Library.FileOpens in a new tabAttributes() メソッドおよび SetAttributes() メソッドを使用します。ファイルの属性は、1 つの整数として集合的に表現されたビット・シーケンスで表されます。個々のビットの意味は、基盤となるオペレーティング・システムによって異なります。

属性のビットの完全なリストは、"クラス・リファレンス" の "%Library.File.Attributes()Opens in a new tab" を参照してください。

属性のビットの文字列を操作する際のヒントは、"整数として実装されるビット文字列の操作" を参照してください。

ファイルとディレクトリの属性の表示

%Library.FileOpens in a new tabAttributes() メソッドは、引数としてファイル名またはディレクトリ名を取り、整数として表現された属性のビット・シーケンスを返します。

以下は、Windows システムで実行した場合の例です。

USER>write ##class(%File).Attributes("iris.dat")
32
USER>write ##class(%File).Attributes("C:\temp")
16
USER>write ##class(%File).Attributes("secret.zip")
35

1 つ目の例の 32 は、iris.dat がアーカイブ・ファイルであることを示します。2 つ目の例の 16 は、C:\temp がディレクトリであることを示します。3 つ目の例では、複数のビットが設定されており、35 は、secret.zip が非表示で (2) 読み取り専用 (1) のアーカイブ (32) であることを示します。32 + 2 + 1 = 35 の計算になります。

以下は、Unix システムで実行した場合の例です。

write ##class(%File).Attributes("/home")
16877

この例の 16877 は、/home が、所有者は読み取り (256)、書き込み (128)、および実行 (64) の許可を持ち、グループは読み取り (32) および実行 (8) の許可を持ち、それ以外は読み取り (4) および実行 (1) の許可を持つディレクトリ (16384) であることを示します。16384 + 256 + 128 + 64 + 32 + 8 + 4 + 1 = 16877 の計算になります。

ファイルとディレクトリの属性の設定

一方、SetAttributes() メソッドは、ファイルまたはディレクトリの属性を設定して (可能な場合)、成功または失敗を示すブーリアン値を返します。このメソッドは、3 つの引数を取ります。1 つ目の引数は、ファイルまたはディレクトリの名前です。2 つ目の引数は、ファイルまたはディレクトリに設定する属性を表す整数です。3 つ目の引数は、出力引数です。これが負の値の場合、メソッドが失敗したときにオペレーティング・システムから返されるエラー・コードが含まれます。

以下は Windows で実行した場合の例で、1 ビットを設定して C:\temp\protectme.txt を読み取り専用にします。

USER>write ##class(%File).Attributes("C:\temp\protectme.txt")
32
USER>write ##class(%File).SetAttributes("C:\temp\protectme.txt",33,.return)
1
USER>write ##class(%File).Attributes("C:\temp\protectme.txt")
33

以下は Unix で実行した場合の例で、既定のディレクトリ内の myfile に対する許可を 644 から完全な許可 (777) に変更します。

USER>write ##class(%File).Attributes("myfile")
33188
USER>write ##class(%File).SetAttributes("myfile",33279,.return)
1
USER>write ##class(%File).Attributes("myfile")
33279

目的の属性値は、通常ファイルの値 (32768) に所有者 (448)、グループ (56)、およびその他 (7) のマスクを加算して計算されます。

ファイルとディレクトリのその他のプロパティの表示

%Library.FileOpens in a new tab のその他のクラス・メソッドでは、ファイルとディレクトリのその他のさまざまなプロパティを確認できます。

GetFileDateCreated() メソッドは、ファイルまたはディレクトリが作成された日付を $H 形式で返します。

USER>write $zdate(##class(%File).GetFileDateCreated("stream"))
12/09/2019
Note:

現在、実際に作成された日付を追跡しているプラットフォームは Windows のみです。その他のプラットフォームは、ファイル・ステータスの最後の変更の日付を格納しています。

GetFileDateModified() メソッドは、ファイルまたはディレクトリが変更された日付を $H 形式で返します。

USER>write $zdate(##class(%File).GetFileDateModified("iris.dat"))
08/20/2020

GetFileSize() メソッドは、ファイルのサイズをバイト単位で返します。

USER>write ##class(%File).GetFileSize("export.xml")
2512

GetDirectorySpace() メソッドは、ドライブまたはディレクトリの空き容量と合計容量を返します。容量は、4 つ目の引数の値が 0、1、2 のいずれであるかによって、バイト、MB (既定値)、GB の単位で返されます。以下の例の 2 は、容量が GB 単位で返されることを示します。

USER>set status = ##class(%File).GetDirectorySpace("C:", .FreeSpace, .TotalSpace, 2)

USER>write FreeSpace
182.87
USER>write TotalSpace
952.89

Windows では、ディレクトリ名をこのメソッドに渡した場合に返される容量は、ドライブ全体の値です。

GetDirectorySpace() メソッドでは、返されるエラー状態はオペレーティング・システム・レベルのエラーです。以下の例の Windows システム・エラー・コード 3 は、"指定されたパスが見つからない" ことを示しています。

USER>set status = ##class(%File).GetDirectorySpace("Q:", .FreeSpace, .TotalSpace, 2)

USER>do $system.Status.DisplayError(status)
 
ERROR #83: Error code = 3
FeedbackOpens in a new tab