ファイル名とディレクトリ名
%Library.FileOpens in a new tab クラスには、ファイル名とディレクトリ名の操作に使用できるクラス・メソッドがいくつか用意されています。ほとんどの場合、これらのメソッドを使用するためにファイルとディレクトリが存在する必要はありません。
ファイル名またはディレクトリ名の一部を指定すると、ほとんどのメソッドでは、作業中のネームスペースの既定のグローバル・データベースが含まれるディレクトリを基準とした項目を参照しているものと想定されます。このディレクトリをここでは "既定のディレクトリ" と呼びます。このルールが当てはまらない場合は注記しています。
また、これらのメソッドでファイル名とディレクトリ名の大文字と小文字が区別されるのは、基盤となるオペレーティング・システムでファイル名とディレクトリ名の大文字と小文字が区別される場合だけです。つまり、UNIX® ではファイル名またはディレクトリ名の大文字と小文字が区別されますが、Windows では区別されません。
ファイル名とディレクトリ名の取得
%Library.FileOpens in a new tab クラスには、ファイル名とディレクトリ名の一部分を取得するのに使用できるクラス・メソッドが用意されています。
完全パス名を指定して GetDirectory() と GetFilename() を使用すると、ディレクトリと短いファイル名をそれぞれ取得できます。このメソッドでは、部分的なディレクトリ名は許可されていません。
USER>set filename = "C:\temp\samples\sample.html"
USER>write ##class(%File).GetDirectory(filename)
C:\temp\samples\
USER>write ##class(%File).GetFilename(filename)
sample.html
ファイル名を指定して CanonicalFilename() を使用すると、ルートからの完全なパスを取得できます。
USER>set filename = "iris.dat"
USER>write ##class(%File).CanonicalFilename(filename)
c:\intersystems\IRIS\mgr\user\iris.dat
USER>write ##class(%File).CanonicalFilename("foo.dat")
指定したファイルを開くことができない場合、CanonicalFilename() メソッドは空の文字列を返します。
ディレクトリ名を指定して ComputeFullDBDir() を使用すると、キャノニック形式のディレクトリ名を構成できます。
USER>write ##class(%File).ComputeFullDBDir("foodirectory")
c:\intersystems\IRIS\mgr\user\foodirectory\
ディレクトリ名を指定して GetDirectoryLength() と GetDirectoryPiece() を使用すると、ディレクトリ内の構成要素の数と特定の構成要素をそれぞれ取得できます。構成要素は、オペレーティング・システムに応じて、スラッシュ (/) または円記号 (\) で区切ることができます。
USER>set dir = "C:\temp\samples"
USER>write ##class(%File).GetDirectoryLength(dir)
3
USER>write ##class(%File).GetDirectoryPiece(dir,1)
C:
ファイル名またはディレクトリ名を指定して ParentDirectoryName() を使用すると、その親ディレクトリを取得できます。
USER>set dir = "stream"
USER>write ##class(%File).ParentDirectoryName(dir)
C:\InterSystems\IRIS\mgr\user\
ファイル名とディレクトリ名の正規化
%Library.FileOpens in a new tab クラスでは、正規化されたファイル名およびディレクトリ名を返すクラス・メソッドが用意されています (サーバが実行されているオペレーティング・システムの命名規則に従います)。これらのメソッドは、既存の名前に名前要素を追加してファイル名やディレクトリ名を新規作成する場合に有用です。
ファイル名を指定すると、NormalizeFilename() は、正規化されたファイル名を返します。
ディレクトリ名を指定すると、NormalizeDirectory() は、正規化されたディレクトリ名を返します。
これらのメソッドは、基盤となるオペレーティング・システムでの使用に適した正規化された名前を返し、スラッシュ (/) または円記号 (\) のパス区切り文字の正規化を試みます。
Windows の例 :
USER>set filename = "C:\temp//samples\myfile.txt"
USER>write ##class(%File).NormalizeFilename(filename)
C:\temp\samples\myfile.txt
USER>write ##class(%File).NormalizeDirectory("stream")
C:\InterSystems\IRIS\mgr\user\stream\
Unix の例 :
USER>set filename = "/tmp//samples/myfile.txt"
USER>write ##class(%File).NormalizeFilename(filename)
/tmp/samples/myfile.txt
USER>write ##class(%File).NormalizeDirectory("stream")
/InterSystems/IRIS/mgr/user/stream/
これらのメソッドのいずれかを呼び出して、指定したディレクトリを基準としたディレクトリ名またはファイル名を正規化する場合、2 つ目の引数を追加します。このディレクトリは存在している必要があります。
Windows の例 :
USER>write ##class(%File).NormalizeFilename("myfile.txt", "C:\temp\samples")
C:\temp\samples\myfile.txt
USER>write ##class(%File).NormalizeDirectory("stream", "")
C:\InterSystems\IRIS\mgr\user\stream\
Unix の例 :
USER>write ##class(%File).NormalizeFilename("myfile.txt", "/tmp/samples")
/tmp/samples/myfile.txt
USER>write ##class(%File).NormalizeDirectory("stream", "")
/InterSystems/IRIS/mgr/user/stream/
SubDirectoryName() メソッドは、引数が 2 つの形式の NormalizeDirectory() と似ていますが、引数の順序が逆になっている点が異なります。また、このディレクトリが存在する必要はありません。末尾の区切り文字を追加する場合は 3 つ目の引数で 1 を渡し、省略する場合は 0 (既定値) を渡します。
Windows の例 :
USER>write ##class(%File).SubDirectoryName("C:\foobar", "samples")
C:\foobar\samples
USER>write ##class(%File).SubDirectoryName("", "stream", 1)
C:\InterSystems\IRIS\mgr\user\stream\
Unix の例 :
USER>write ##class(%File).SubDirectoryName("/foobar", "samples")
/foobar/samples
USER>write ##class(%File).SubDirectoryName("", "stream", 1)
/InterSystems/IRIS/mgr/user/stream/
スペースが含まれるファイル名とディレクトリ名の処理
スペースが含まれるファイル名またはディレクトリ名の場合、NormalizeFilenameWithSpaces() を使用します。これにより、ホスト・プラットフォームに適した方法でパス名に含まれるスペースが処理されます。NormalizeFilename() や NormalizeDirectory() とは異なり、このメソッドは引数を 1 つしか取りません。また、別のディレクトリを基準としたファイル名またはディレクトリ名を正規化することはできず、既定のディレクトリを基準としたファイル名またはディレクトリ名の一部分を正規化することもありません。
Windows システムでは、パス名にスペースが含まれていて、ファイルまたはディレクトリが存在しない場合、このメソッドはパス名を二重引用符で囲んで返します。パス名にスペースが含まれていて、ファイルまたはディレクトリが存在する場合、このメソッドはパス名の短い形式を返します。パス名にスペースが含まれない場合、このメソッドはパス名を変更なしで返します。
USER>write ##class(%File).NormalizeFilenameWithSpaces("C:\temp\nonexistant folder")
"C:\temp\nonexistant folder"
USER>write ##class(%File).NormalizeFilenameWithSpaces("C:\temp\existant folder")
C:\temp\EXISTA~1
USER>write ##class(%File).NormalizeFilenameWithSpaces("iris.dat")
iris.dat
詳細は、"クラス・リファレンス" の "%Library.File.NormalizeFilenameWithSpaces()Opens in a new tab" を参照してください。
Unix システムでは、パス名にスペースが含まれている場合、このメソッドはパス名を二重引用符で囲んで返します。パス名にスペースが含まれない場合、このメソッドはパス名を変更なしで返します。
USER>write ##class(%File).NormalizeFilenameWithSpaces("/InterSystems/my directory")
"/InterSystems/my directory"
USER>write ##class(%File).NormalizeFilenameWithSpaces("iris.dat")
iris.dat
ファイル名とディレクトリ名の構成と分解
%Library.FileOpens in a new tab クラスには、パスの配列からファイル名を構成する際、およびファイル名をパスの配列に分解する際に使用できるクラス・メソッドが用意されています。
パスの配列を指定すると、Construct() はパスを構成して、ファイル名を返します。構成されるファイル名は、サーバ・プラットフォームに適したものです。引数なしでこのメソッドを呼び出すと、既定のディレクトリが返されます。
ファイル名を指定すると、Deconstruct() は、ファイル名を分解してパスの配列を返します。配列の内容は、サーバ・プラットフォームに適したものです。
以下の Windows の例では、配列 dirs を Construct() に渡しています。配列の最後の位置にある空の文字列は、返されるファイル名が \ で終わる必要があることを示します。
USER>zwrite dirs
dirs=4
dirs(1)="C:"
dirs(2)="Temp"
dirs(3)="samples"
dirs(4)=""
USER>write ##class(%File).Construct(dirs...)
C:\Temp\samples\
以下の Unix の例では、引数なしで Construct() を呼び出しています。メソッドは、既定のディレクトリを返します。
USER>set default = ##class(%File).Construct()
USER>write default
/InterSystems/IRIS/mgr/user
以下の Unix の例では、Deconstruct() を呼び出しています。これは、変数 default でパスを取得し、それらのパスを配列 defaultdir に格納します。
USER>do ##class(%File).Deconstruct(default, .defaultdir)
USER>zwrite defaultdir
defaultdir=4
defaultdir(1)="InterSystems"
defaultdir(2)="IRIS"
defaultdir(3)="mgr"
defaultdir(4)="user"
システム・マネージャ・ディレクトリの取得
ManagerDirectory() メソッドを使用すると、installdir/mgr ディレクトリの完全修飾名を取得できます。例えば、以下のように指定します。
USER>write ##class(%File).ManagerDirectory()
C:\InterSystems\IRIS\mgr\