Skip to main content

ディレクトリとドライブに対するクエリ

%Library.FileOpens in a new tab クラスには、ドライブとディレクトリにクエリを実行できるクラス・クエリが用意されています。

ディレクトリの内容のリスト

FileSet() クラス・クエリで、ディレクトリの内容をリストします。このクエリは、以下のパラメータをこの順序で受け入れます。

  1. directory — 確認するディレクトリの名前を指定します。

  2. wildcards — 一致させるファイル名パターンを指定します (使用する場合)。詳細は、$ZSEARCH のリファレンスの “ワイルドカード” のセクションを参照してください。

  3. sortby — 結果の並べ替え方法を指定します。以下の値のいずれかを使用します。

    • Name — ファイルの名前 (既定値)

    • Type — 項目タイプ

    • DateCreated — ファイルが作成された日時

    • DateModified — ファイルが前回変更された日時

    • Size — ファイル・サイズ

  4. includedirs — 指定したディレクトリ内のディレクトリを処理する方法を指定します。この引数が true (1) の場合、クエリはファイルより先にすべてのディレクトリを返します。また、ディレクトリ名では wildcards 引数は無視されます。この引数が false (0) の場合、wildcards 引数はファイルとディレクトリの両方に適用されます。既定値は 0 です。

  5. delimiterwildcards 引数内のワイルドカードの区切り文字を指定します。既定値は ; です。

このクエリによって返される結果セットには、以下のフィールドがあります。

  • Name — 項目の完全パス名。

  • Type — 項目のタイプ。F はファイル、D はディレクトリ、S はシンボリック・リンクを示します。

  • Size — ファイル・サイズ (バイト単位)。このフィールドは、ディレクトリおよびシンボリック・リンクでは NULL になります。

  • DateCreated — 項目が作成された日時。形式は yyyy-mm-dd hh:mm:ss。

  • DateModified — 項目が前回変更された日時。形式は yyyy-mm-dd hh:mm:ss。

  • ItemName — 項目の短い名前。ファイルの場合、ディレクトリの付かないファイル名のみです。ディレクトリの場合は、ディレクトリ・パスの最後の部分のみです。

Note:

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

このクラス・クエリを使用した簡単な例を以下に示します。

ClassMethod ShowDir(dir As %String = "", wildcard As %String = "", sort As %String = "Name")
{
  set stmt = ##class(%SQL.Statement).%New()
  set status = stmt.%PrepareClassQuery("%File", "FileSet")
  if $$$ISERR(status) {write "%Prepare failed:" do $SYSTEM.Status.DisplayError(status) quit}

  set rset = stmt.%Execute(dir, wildcard, sort)
  if (rset.%SQLCODE '= 0) {write "%Execute failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

  while rset.%Next()
  {
    write !, rset.%Get("Name")
    write " ", rset.%Get("Type")
    write " ", rset.%Get("Size")
  }
  if (rset.%SQLCODE < 0) {write "%Next failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}
}

メソッドが User.FileTest クラスにあると仮定した場合、ターミナルから指定のディレクトリに対してこのメソッドを実行し、ログ・ファイルをフィルタリングで抽出してファイル・サイズで並べ替えると、以下のようになります。

USER>do ##class(FileTest).ShowDir("C:\InterSystems\IRIS\mgr", "*.log", "Size")
 
C:\InterSystems\IRIS\mgr\alerts.log F 380
C:\InterSystems\IRIS\mgr\FeatureTracker.log F 730
C:\InterSystems\IRIS\mgr\journal.log F 743
C:\InterSystems\IRIS\mgr\ensinstall.log F 12577
C:\InterSystems\IRIS\mgr\iboot.log F 40124
C:\InterSystems\IRIS\mgr\SystemMonitor.log F 483865
C:\InterSystems\IRIS\mgr\messages.log F 4554535

別の例として、以下のメソッドは、ディレクトリとそのすべてのサブディレクトリを再帰的に調べて、見つかった各ファイルの名前を書き出します。

ClassMethod ShowFilesInDir(directory As %String = "")
{
  set stmt = ##class(%SQL.Statement).%New()
  set status = stmt.%PrepareClassQuery("%File", "FileSet")
  if $$$ISERR(status) {write "%Prepare failed:" do $SYSTEM.Status.DisplayError(status) quit}  

  set rset = stmt.%Execute(directory) 
  if (rset.%SQLCODE '= 0) {write "%Execute failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

  while rset.%Next()
  {
    set name = rset.%Get("Name")
    set type = rset.%Get("Type")

    if (type = "F") {
      write !, name
     } elseif (type = "D"){
      do ..ShowFilesInDir(name)
    }
  }
  if (rset.%SQLCODE < 0) {write "%Next failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}
}

ターミナルで既定のディレクトリに対してこのメソッドを実行すると、以下のようになります。

USER>do ##class(FileTest).ShowFilesInDir()                                       

C:\InterSystems\IRIS\mgr\user\IRIS.DAT
C:\InterSystems\IRIS\mgr\user\iris.lck
C:\InterSystems\IRIS\mgr\user\userenstemp\IRIS.DAT
C:\InterSystems\IRIS\mgr\user\userenstemp\iris.lck
C:\InterSystems\IRIS\mgr\user\usersecondary\IRIS.DAT
C:\InterSystems\IRIS\mgr\user\usersecondary\iris.lck

ドライブまたはマウントされたファイル・システムのリスト

DriveList() クラス・クエリは、使用可能なドライブ (Windows の場合) またはマウントされているファイル・システム (UNIX の場合) をリストします。このクエリは、以下の 1 つのパラメータを受け入れます。

  1. fullyqualified — この引数が 1 の場合、各 Windows ドライブ名の最後に円記号が追加されます。この引数は他のプラットフォームには影響しません。既定値は 0 です。

このクエリによって返される結果セットには、フィールドが 1 つあります。

  • Drive — ドライブの名前 (Windows の場合) またはマウントされているファイル・システムの名前 (UNIX® の場合)。

以下の例は、このクエリを使用する方法を示しています。

ClassMethod ShowDrives()
{
  set stmt = ##class(%SQL.Statement).%New()
  set status = stmt.%PrepareClassQuery("%File","DriveList")
  if $$$ISERR(status) {write "%Prepare failed:" do $SYSTEM.Status.DisplayError(status) quit}

  set rset = stmt.%Execute(1)
  if (rset.%SQLCODE '= 0) {write "%Execute failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

  while rset.%Next()
  {
    write !, rset.%Get("Drive")
  }
  if (rset.%SQLCODE < 0) {write "%Next failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}
}

ここでも、このメソッドが User.FileTest クラス内にあると仮定した場合、ターミナルでこのメソッドを実行すると、以下のようになります。

USER>do ##class(FileTest).ShowDrives()
 
c:\
x:\
FeedbackOpens in a new tab