ディレクトリの操作
%Library.FileOpens in a new tab クラスには、ディレクトリに対して以下のようなさまざまな操作を実行できるクラス・メソッドがいくつか用意されています。
ファイル名またはディレクトリ名の一部を指定すると、ほとんどのメソッドでは、作業中のネームスペースの既定のグローバル・データベースが含まれるディレクトリを基準とした項目を参照しているものと想定されます。このディレクトリをここでは "既定のディレクトリ" と呼びます。このルールが当てはまらない場合は注記しています。
また、これらのメソッドでファイル名とディレクトリ名の大文字と小文字が区別されるのは、基盤となるオペレーティング・システムでファイル名とディレクトリ名の大文字と小文字が区別される場合だけです。つまり、UNIX® ではファイル名またはディレクトリ名の大文字と小文字が区別されますが、Windows では区別されません。
ディレクトリの作成
ディレクトリを作成するには、CreateDirectory() メソッドを使用します。このメソッドは、成功または失敗を示すブーリアン値を返します。このメソッドは、2 つの引数を取ります。1 つ目の引数は、作成するディレクトリの名前です。2 つ目の引数は、出力引数です。これが負の値の場合、メソッドが失敗したときにオペレーティング・システムから返されるエラー・コードが含まれます。
C:\temp が既に存在する場合、以下のコマンドは失敗し、"既に存在するファイルを作成することはできない" という意味の Windows システム・エラー・コード 183 が返されます。
USER>write ##class(%File).CreateDirectory("C:\temp", .return)
0
USER>write return
-183
C:\temp が既に存在していても、C:\temp\test は存在しない場合、以下のコマンドは失敗します。CreateDirectory() は、最大でも、指定したディレクトリ・パスの最後のディレクトリしか作成しないためです。したがって、返される Windows システム・エラー・コードは 3 ("指定されたパスを見つけられませんでした") です。
USER>write ##class(%File).CreateDirectory("C:\temp\test\this", .return)
0
USER>write return
-3
以下の例は成功し、Windows システム・コード 0 ("操作は正常に終了しました") が返されます。
USER>write ##class(%File).CreateDirectory("C:\temp\test", .return)
1
USER>write return
0
類似する CreateNewDir() メソッドは、指定した親ディレクトリ内に新しいディレクトリを作成します。このメソッドは、3 つの引数を取ります。1 つ目の引数は、親ディレクトリの名前です。2 つ目の引数は、作成するディレクトリの名前です。3 つ目の引数は、出力引数です。これが負の値の場合、メソッドが失敗したときにオペレーティング・システムから返されるエラー・コードが含まれます。
以下の 1 つ目の例では、親ディレクトリ C:\temp 内に newdir という名前のディレクトリを作成します。2 つ目の例では、既定のディレクトリ内に newdir という名前の新しいディレクトリを作成します。
USER>write ##class(%File).CreateNewDir("C:\temp", "newdir", .return)
1
USER>write ##class(%File).CreateNewDir("", "newdir", .return)
1
関連するもう 1 つのメソッド CreateDirectoryChain() は、指定したディレクトリ・パスにすべてのディレクトリを作成します (可能な場合)。
以下の 1 つ目の例では、親ディレクトリ C:\temp 内に、入れ子になった 3 つのディレクトリを作成します。以下の 2 つ目の例では、既定のディレクトリ内に、入れ子になった 3 つのディレクトリを作成します。
USER>write ##class(%File).CreateDirectoryChain("C:\temp\one\two\three", .return)
1
USER>write ##class(%File).CreateDirectoryChain("one\two\three", .return)
1
ディレクトリのコピー
ディレクトリをコピーするには、CopyDir() メソッドを使用します。このメソッドは、成功または失敗を示すブーリアン値を返します。
このメソッドは、以下の 5 つの引数を取ります。
-
pSource — ソース・ディレクトリの名前を指定します。
-
pTarget — ターゲット・ディレクトリの名前を指定します。
-
pOverlay — ターゲット・ディレクトリが存在する場合にそれを上書きするかどうかを指定します。既定値は 0 です。
-
pCreated — コピー・プロセスで作成されたファイルまたはディレクトリの数が含まれる出力引数です。
-
pDeleteBeforeCopy — コピーを実行する前に、ターゲット・ディレクトリに存在するファイルを削除するかどうかを指定します。既定値は 0 です。
pSource または pTarget にディレクトリ名の一部を指定した場合、ディレクトリ名は、作業中のネームスペースの既定のグローバル・データベースが含まれるディレクトリを基準として計算されます。
ディレクトリ作成メソッドとは異なり、CopyDir() には、システム・エラー・コードを返すための出力引数はありません。
以下の 1 つ目の例では、コピー操作が成功し、46 個のファイルとディレクトリが C:\temp から C:\temp2 にコピーされます。2 つ目の例では、コピー操作が成功し、46 個のファイルとディレクトリが、C:\temp から既定のディレクトリ内の temp2 にコピーされます。
USER>write ##class(%File).CopyDir("C:\temp", "C:\temp2", 0, .pCreated, 0)
1
USER>write pCreated
46
USER>write ##class(%File).CopyDir("C:\temp", "temp2", 0, .pCreated, 0)
1
USER>write pCreated
46
最後の例では、pOverlay が 0 に設定されていて、ターゲット・ディレクトリが既に存在するため、コピーは失敗します。
USER>write ##class(%File).CopyDir("C:\temp", "C:\temp2", 0, .pCreated, 0)
0
USER>write pCreated
0
ディレクトリの削除
空でないディレクトリを削除するには、RemoveDirectory() メソッドを使用します。このメソッドは、成功した場合に 1 を返し、失敗した場合に 0 を返します。このメソッドは、2 つの引数を取ります。1 つ目の引数は、削除するディレクトリの名前です。2 つ目の引数は出力引数で、メソッドが失敗したときにオペレーティング・システムから返されるエラー・コードが含まれます。
以下の 1 つ目の例では、メソッドは成功します。2 つ目の例は失敗し、Windows エラー・コード 145 ("ディレクトリが空ではありません") が返されます。
USER>write ##class(%File).RemoveDirectory("C:\temp2\newdir", .return)
1
USER>write ##class(%File).RemoveDirectory("C:\temp2", .return)
0
USER>write return
-145
サブディレクトリが含まれるディレクトリを削除するには、RemoveDirectoryTree() メソッドを使用します。このメソッドは、成功した場合に 1 を返し、失敗した場合に 0 を返します。RemoveDirectory() メソッドとは異なり、RemoveDirectoryTree() には、システム・エラー・コードを返すための出力引数はありません。
RemoveDirectoryTree() は、ディレクトリおよびサブディレクトリが空でない場合も成功します。
USER>write ##class(%File).RemoveDirectoryTree("C:\temp2")
1
ディレクトリの名前変更
ディレクトリの名前を変更するには、Rename() メソッドを使用します。このメソッドは、成功した場合に 1 を返し、失敗した場合に 0 を返します。このメソッドは、3 つの引数を取ります。1 つ目の引数は名前を変更するディレクトリの名前で、2 つ目の引数は新しい名前です。3 つ目の引数は、出力引数です。これが負の値の場合、メソッドが失敗したときにオペレーティング・システムから返されるエラー・コードが含まれます。
Rename() を使用したディレクトリの名前変更は、そのディレクトリのファイル・システムが、作業中のファイル・システムと同じ場合にのみ機能します。
以下の 1 つ目の例では、メソッドは成功します。2 つ目の例では、C:\nodir は存在しないため、メソッドは失敗し、Windows エラー・コード 3 ("指定されたパスを見つけられませんでした") が返されます。
USER>write ##class(%File).Rename("C:\temp\oldname", "C:\temp\newname", .return)
1
USER>write ##class(%File).Rename("C:\nodir\oldname", "C:\nodir\newname", .return)
0
USER>write return
-3
このメソッドを使用する際には、パスの指定を慎重に行う必要があります。例えば、以下の例は、C:\temp\oldname を既定のディレクトリに移動してから、newname に名前変更する処理となります。
USER>write ##class(%File).Rename("C:\temp\oldname", "newname", .return)
1