File オブジェクトの操作



File オブジェクトは、ファイルシステム内のファイルまたはディレクトリへのポインタです。

File クラスは FileReference クラスを拡張します。FileReference クラス(Adobe® Flash® Player および AIR で利用可能)はファイルへのポインタを表しますが、File クラスには、セキュリティ上の考慮事項により Flash Player(ブラウザで実行している SWF ファイル)で公開されていない追加のプロパティおよびメソッドがあります。

File クラスについて

File クラスを使用して以下を実行できます。

  • 特殊なディレクトリへのパスの取得(ユーザディレクトリ、ユーザのドキュメントディレクトリ、アプリケーションが起動されたディレクトリ、アプリケーションディレクトリなど)

  • ファイルおよびディレクトリのコピー

  • ファイルおよびディレクトリの移動

  • ファイルおよびディレクトリの削除(またはごみ箱への移動)

  • ディレクトリに格納されているファイルおよびディレクトリの一覧の出力

  • 一時ファイルおよび一時フォルダの作成

File オブジェクトでファイルパスを参照すると、FileStream クラスでそれを使用してファイルデータの読み取りと書き込みができるようになります。

File オブジェクトでは、まだ存在しないファイルまたはディレクトリのパスを参照できます。このような File オブジェクトは、ファイルまたはディレクトリの作成に使用できます。

File オブジェクトのパス

各 File オブジェクトには、そのオブジェクトのパスをそれぞれ定義する 2 つのプロパティがあります。

プロパティ

説明

nativePath

ファイルへのプラットフォーム固有のパスを指定します。例えば、Windows では「c:¥Sample directory¥test.txt」、Macintosh では「/Sample directory/test.txt」のようになります。nativePath プロパティでは、ディレクトリの区切り文字として、Windows では円記号(¥)、Macintosh および Linux ではスラッシュ(/)を使用します。

url

file URL スキームを使用してファイルを参照できます。例えば、Windows では「file:///c:/Sample%20directory/test.txt」、Macintosh では「file:///Sample%20directory/test.txt」のようになります。ランタイムには、file 以外にも特殊な URL スキームが含まれます。それらについては、サポートされる URL スキームで説明します。

File クラスには、Macintosh、Windows および Linux の標準のディレクトリを参照するための静的プロパティが含まれます。これらのプロパティは次のとおりです。

  • File.applicationStorageDirectory - インストールされている各 AIR アプリケーションに固有の記憶領域ディレクトリ

  • File.applicationDirectory - (インストールされているアセットと共に)アプリケーションがインストールされているディレクトリ

  • File.desktopDirectory - ユーザのデスクトップディレクトリ

  • File.documentsDirectory - ユーザのドキュメントディレクトリ

  • File.userDirectory - ユーザディレクトリ

これらのプロパティには、様々なオペレーティングシステムで意味のある値が設定されます。例えば、Mac OS、Linux および Windows にはそれぞれ、ユーザのデスクトップディレクトリへの異なるネイティブパスがあります。ただし、File.desktopDirectory プロパティは、これらの各プラットフォーム上の正しいデスクトップディレクトリパスを参照します。複数のプラットフォームにわたって正常に機能するアプリケーションを作成するには、アプリケーションが使用する他のディレクトリやファイルを参照する土台としてこれらのプロパティを使用します。次に、resolvePath() メソッドを使用してパスの詳細を設定します。例えば、次のコードは、アプリケーション記憶領域ディレクトリの preferences.xml ファイルを参照しています。

var prefsFile:File = File.applicationStorageDirectory; 
prefsFile = prefsFile.resolvePath("preferences.xml");

File クラスでは特定のファイルパスを参照できますが、その場合、アプリケーションが複数のプラットフォームにわたって機能しなくなる可能性があります。例えば、C:¥Documents and Settings¥joe¥ というパスは、Windows 上でのみ機能します。このような理由から、File.documentsDirectory などの File クラスの静的プロパティを使用することをお勧めします。

これらの File プロパティについて詳しくは、次の節を参照してください。

File オブジェクトでのディレクトリの参照

File オブジェクトでディレクトリの参照を設定するには、様々な方法があります。

ユーザのホームディレクトリの参照

File オブジェクトでユーザのホームディレクトリを参照できます。Windows では、ホームディレクトリは、My Documents ディレクトリ(例えば、「C:¥Documents and Settings¥ユーザ名¥My Documents」)です。Macintosh では、Users/ユーザ名 ディレクトリです。Linux では、/home/ユーザ名 ディレクトリです。次のコードでは、ホームディレクトリの AIR Test サブディレクトリを参照するように File オブジェクトを設定しています。

var file:File = File.userDirectory.resolvePath("AIR Test"); 

ユーザのドキュメントディレクトリの参照

File オブジェクトでユーザのドキュメントディレクトリを参照できます。Windows のデフォルトの場所は、My Documents ディレクトリ(例えば、「C:¥Documents and Settings¥ユーザ名¥My Documents」)です。Macintosh のデフォルトの場所は、Users/ユーザ名/Documents ディレクトリです。Linux のデフォルトの場所は、/home/ユーザ名/Documents ディレクトリです。次のコードでは、ドキュメントディレクトリの AIR Test サブディレクトリを参照するように File オブジェクトを設定しています。

var file:File = File.documentsDirectory.resolvePath("AIR Test");

デスクトップディレクトリの参照

File オブジェクトでデスクトップを参照できます。次のコードでは、デスクトップの AIR Test サブディレクトリを参照するように File オブジェクトを設定しています。

var file:File = File.desktopDirectory.resolvePath("AIR Test");

アプリケーション記憶領域ディレクトリの参照

File オブジェクトでアプリケーション記憶領域ディレクトリを参照できます。AIR アプリケーションにはそれぞれ、アプリケーション記憶領域ディレクトリを定義する一意のパスが関連付けられています。このディレクトリは、アプリケーションおよびユーザごとに一意に割り当てられます。このディレクトリは、ユーザおよびアプリケーションに固有のデータ(ユーザデータや環境設定ファイルなど)を格納するために使用できます。例えば、次のコードでは、アプリケーション記憶領域ディレクトリに格納されている prefs.xml という環境設定ファイルを File オブジェクトで参照します。

var file:File = File.applicationStorageDirectory; 
file = file.resolvePath("prefs.xml";

アプリケーション記憶領域ディレクトリの場所は、ユーザ名、アプリケーション ID および発行者 ID に基づきます。

  • Macintosh の場合

    /Users/ユーザ名/Library/Preferences/アプリケーション ID.発行者 ID/Local Store/

    次に例を示します。

    /Users/babbage/Library/Preferences/com.example.TestApp.02D88EEED35F84C264A183921344EEA353A629FD.1/Local Store
  • Windows の場合(Documents and Settings ディレクトリ内)

    ユーザ名/Application Data/アプリケーション ID.発行者 ID/Local Store/

    次に例を示します。

    C:\Documents and Settings\babbage\Application Data\com.example.TestApp.02D88EEED35F84C264A183921344EEA353A629FD.1\Local Store
  • Linux の場合

    /home/ユーザ名/.appdata/アプリケーション ID.発行者 ID/Local Store/

    次に例を示します。

    /home/babbage/.appdata/com.example.TestApp.02D88EEED35F84C264A183921344EEA353A629FD.1/Local Store

url で作成された File オブジェクトの (および File.applicationStorageDirectoryurl プロパティ)では、次のように app-storage URL スキーム(サポートされる URL スキームを参照)が使用されます。

var dir:File = File.applicationStorageDirectory; 
dir = dir.resolvePath("preferences"); 
trace(dir.url); // app-storage:/preferences

アプリケーションディレクトリの参照

File オブジェクトで、アプリケーションがインストールされたディレクトリ(アプリケーションディレクトリ)を参照できます。このディレクトリを参照するには、File.applicationDirectory プロパティを使用します。このディレクトリでは、アプリケーション記述ファイルなど、アプリケーションと共にインストールされたリソースを確認できます。例えば、次のコードでは、アプリケーションディレクトリにある images というディレクトリを File オブジェクトで参照します。

var dir:File = File.applicationDirectory; 
dir = dir.resolvePath("images"); 

url で作成された File オブジェクトの (および File.applicationDirectoryurl プロパティ)では、次のように app URL スキーム(サポートされる URL スキームを参照)が使用されます。

var dir:File = File.applicationDirectory; 
dir = dir.resolvePath("images"); 
trace(dir.url); // app:/images

ファイルシステムのルートの参照

File.getRootDirectories() メソッドは、すべてのルートボリュームの一覧を出力します。Windows コンピュータの場合は、C: およびマウントされたボリュームが含まれます。Macintosh および Linux の場合は、常にマシンの一意のルートディレクトリ(「/」ディレクトリ)が返されます。

明示的なディレクトリの参照

File オブジェクトの nativePath プロパティを設定することにより、File オブジェクトで明示的なディレクトリを参照できます。Windows の場合の例を次に示します。

var file:File = new File(); 
file.nativePath = "C:\\AIR Test\";

重要: このような方法で明示的なパスを参照すると、コードが複数のプラットフォームにわたって機能しなくなる可能性があります。例えば、前の例は Windows 上でのみ機能します。クロスプラットフォームで機能するディレクトリを見つけるには、File.applicationStorageDirectory などの File オブジェクトの静的プロパティを使用する必要があります。次に、resolvePath() メソッド(次の節を参照)を使用して、相対パスに移動します。

相対パスのナビゲーション

resolvePath() メソッドを使用すると、別の特定のパスを基準とした相対的なパスを取得できます。例えば、次のコードでは、ユーザのホームディレクトリの AIR Test サブディレクトリを参照するように File オブジェクトを設定しています。

var file:File = File.userDirectory; 
file = file.resolvePath("AIR Test");

また、次のように、File オブジェクトの url プロパティを使用すると、URL ストリングに基づいてディレクトリを参照することもできます。

var urlStr:String = "file:///C:/AIR Test/"; 
var file:File = new File() 
file.url = urlStr; 

詳しくは、File パスの変更を参照してください。

参照するディレクトリの選択

File クラスの browseForDirectory() メソッドを使用すると、ユーザがオブジェクトに割り当てるディレクトリを選択できるシステムダイアログボックスを表示できます。browseForDirectory() メソッドは、非同期のメソッドです。このメソッドでは、ユーザがディレクトリを選択して「開く」ボタンをクリックすると select イベントを送出し、ユーザが「キャンセル」ボタンをクリックすると cancel イベントを送出します。

例えば、次のコードでは、ユーザがディレクトリを選択できるようにし、その選択に応じたディレクトリパスを出力します。

var file:File = new File(); 
file.addEventListener(Event.SELECT, dirSelected); 
file.browseForDirectory("Select a directory"); 
function dirSelected(e:Event):void { 
    trace(file.nativePath); 
}

アプリケーションを起動したディレクトリの参照

アプリケーションを起動したディレクトリの場所を取得するには、アプリケーションの起動時に送出された InvokeEvent オブジェクトの currentDirectory プロパティを確認します。詳しくは、コマンドライン引数のキャプチャを参照してください。

File オブジェクトでのファイルの参照

File オブジェクトで参照するファイルを設定するには、様々な方法があります。

明示的なファイルパスの参照

重要: 明示的なパスを参照すると、コードが複数のプラットフォームにわたって機能しなくなる可能性があります。例えば、C:¥foo.txt というパスは、Windows 上でのみ機能します。クロスプラットフォームで機能するディレクトリを見つけるには、File.applicationStorageDirectory などの File オブジェクトの静的プロパティを使用する必要があります。次に、resolvePath() メソッド(File パスの変更を参照)を使用して、相対パスに移動します。

次のように、File オブジェクトの url プロパティを使用すると、URL ストリングに基づいてファイルまたはディレクトリを参照できます。

var urlStr:String = "file:///C:/AIR Test/test.txt"; 
var file:File = new File() 
file.url = urlStr; 

URL は、次のように File() コンストラクタ関数に渡すこともできます。

var urlStr:String = "file:///C:/AIR Test/test.txt"; 
var file:File = new File(urlStr); 

url プロパティでは、常に URI エンコード形式の URL が返されます(例えば、スペースは "%20 に置き換えられます)。

file.url = "file:///c:/AIR Test"; 
trace(file.url); // file:///c:/AIR%20Test 

また、File オブジェクトの nativePath プロパティを使用して明示的なパスを設定することもできます。例えば、次のコードを Windows コンピュータで実行すると、C: ドライブの AIR Test サブディレクトリにある test.txt ファイルを参照するように File オブジェクトが設定されます。

var file:File = new File(); 
file.nativePath = "C:/AIR Test/test.txt"; 

このパスは、次のように File() コンストラクタ関数に渡すこともできます。

var file:File = new File("C:/AIR Test/test.txt"); 

nativePath プロパティのパス区切り文字としては、スラッシュ(/)を使用します。Windows では、円記号(¥)も使用できますが、その場合、アプリケーションが複数のプラットフォームにわたって機能しなくなる可能性があります。

詳しくは、File パスの変更を参照してください。

ディレクトリ内のファイルの列挙

File オブジェクトの getDirectoryListing() メソッドを使用すると、ディレクトリのルートレベルにあるファイルおよびサブディレクトリを参照する File オブジェクトの配列を取得することができます。詳しくは、ディレクトリの列挙を参照してください。

参照するファイルの選択

File クラスには、ユーザがオブジェクトに割り当てるファイルを選択できるシステムダイアログボックスを表示する以下のメソッドがあります。

  • browseForOpen()

  • browseForSave()

  • browseForOpenMultiple()

これらのメソッドでは、いずれも非同期で処理が行われます。browseForOpen() メソッドと browseForSave() メソッドでは、ユーザがファイル(browseForSave() の場合はターゲットパス)を選択すると select イベントを送出します。browseForOpen() メソッドと browseForSave() メソッドのターゲットの File オブジェクトは、その選択に応じて、選択されたファイルを参照します。browseForOpenMultiple () メソッドでは、ユーザがファイルを選択すると selectMultiple イベントを送出します。selectMultiple イベントは FileListEvent 型のイベントで、その files プロパティに(選択されたファイルを参照する) File オブジェクトの配列が格納されます。

例えば、次のコードでは、ファイルを選択するための「開く」ダイアログボックスが表示されます。

var fileToOpen:File = File.documentsDirectory; 
selectTextFile(fileToOpen); 
 
function selectTextFile(root:File):void 
{ 
    var txtFilter:FileFilter = new FileFilter("Text", "*.as;*.css;*.html;*.txt;*.xml"); 
    root.browseForOpen("Open", [txtFilter]); 
    root.addEventListener(Event.SELECT, fileSelected); 
} 
 
function fileSelected(event:Event):void 
{ 
    trace(fileToOpen.nativePath); 
} 

アプリケーションで別の参照ダイアログボックスが開かれている場合に参照メソッドを呼び出すと、ランタイムから Error 例外がスローされます。

File パスの変更

resolvePath() メソッドを呼び出すか、オブジェクトの nativePath プロパティまたは url プロパティを変更することにより、既存の File オブジェクトのパスを変更することもできます。Windows の場合の例を次に示します。

var file1:File = File.documentsDirectory; 
file1 = file1.resolvePath("AIR Test"); 
trace(file1.nativePath); // C:\Documents and Settings\userName\My Documents\AIR Test 
var file2:File = File.documentsDirectory; 
file2 = file2.resolvePath(".."); 
trace(file2.nativePath); // C:\Documents and Settings\userName 
var file3:File = File.documentsDirectory; 
file3.nativePath += "/subdirectory"; 
trace(file3.nativePath); // C:\Documents and Settings\userName\My Documents\subdirectory 
var file4:File = new File(); 
file4.url = "file:///c:/AIR Test/test.txt"; 
trace(file4.nativePath); // C:\AIR Test\test.txt 

nativePath プロパティを使用する場合、ディレクトリの区切り文字としてスラッシュ(/)を使用します。Windows では、円記号(¥)も使用できますが、コードがクロスプラットフォームで機能しなくなるため、それは避ける必要があります。

サポートされる URL スキーム

File オブジェクトの url プロパティの定義では、以下のいずれかの URL スキームを使用できます。

URL スキーム

説明

file

ファイルシステムのルートを基準とした相対的なパスを指定する場合に使用します。次に例を示します。

file:///c:/AIR Test/test.txt

file URL を指定する標準的な URL の形式は、file://<host>/<path> です。例外として、<host> のストリングは空にすることができます。その場合、「URL の解釈を行っているマシン」を示すものと解釈されます。そのため、file URL では、スラッシュが 3 つ連なる(///)ことがよくあります。

app

インストールされたアプリケーションのルートディレクトリ(インストールされたアプリケーションの application.xml ファイルが格納されたディレクトリ)を基準とした相対的なパスを指定する場合に使用します。例えば、次のパスは、インストールされているアプリケーションのディレクトリの images サブディレクトリを参照しています。

app:/images

app-storage

アプリケーション記憶領域ディレクトリを基準とした相対的なパスを指定する場合に使用します。AIR では、インストールされたアプリケーションごとに、一意のアプリケーション記憶領域ディレクトリが定義されます。このディレクトリは、そのアプリケーション固有のデータを格納するための便利な場所として使用できます。例えば、次のパスは、アプリケーション記憶領域ディレクトリの settings サブディレクトリにある prefs.xml ファイルを参照しています。

app-storage:/settings/prefs.xml

2 つのファイル間の相対パスの取得

getRelativePath() メソッドを使用すると、2 つのファイル間の相対パスを取得できます。

var file1:File = File.documentsDirectory.resolvePath("AIR Test"); 
var file2:File = File.documentsDirectory 
file2 = file2.resolvePath("AIR Test/bob/test.txt"); 
 
trace(file1.getRelativePath(file2)); // bob/test.txt 

getRelativePath() メソッドの 2 番目のパラメータである useDotDot> パラメータを使用すると、.. シンタックスを結果として返して、親ディレクトリを示すことができます。

var file1:File = File.documentsDirectory; 
file1 = file1.resolvePath("AIR Test"); 
var file2:File = File.documentsDirectory; 
file2 = file2.resolvePath("AIR Test/bob/test.txt"); 
var file3:File = File.documentsDirectory; 
file3 = file3.resolvePath("AIR Test/susan/test.txt"); 
 
trace(file2.getRelativePath(file1, true)); // ../.. 
trace(file3.getRelativePath(file2, true)); // ../../bob/test.txt 

標準化バージョンのファイル名の取得

Windows および Macintosh では、ファイル名およびパス名で大文字と小文字が区別されません。次のような場合、2 つの File オブジェクトで同じファイルが参照されます。

File.documentsDirectory.resolvePath("test.txt"); 
File.documentsDirectory.resolvePath("TeSt.TxT");

ただし、実際のドキュメント名やディレクトリ名には大文字も使用されます。例えば、次の例では、ドキュメントディレクトリに AIR Test というフォルダがあることを前提にしています。

var file:File = File.documentsDirectory.resolvePath("AIR test"); 
trace(file.nativePath); // ... AIR test 
file.canonicalize(); 
trace(file.nativePath); // ... AIR Test 

canonicalize() () メソッドでは、大文字と小文字が区別された正しいファイル名またはディレクトリ名を使用するように nativePath プロパティが変換されます。Linux などの大文字と小文字を区別するファイルシステムでは、大文字と小文字の区別だけが異なる複数のファイルが存在する場合、canonicalize() メソッドにより、最初に見つかったファイル(ファイルシステムによって決められた順序による)に合わせてパスが調整されます。

canonicalize() メソッドは、次のように、Windows で短いファイル名(「8.3」形式の名前)を長いファイル名に変換する場合にも使用できます。

var path:File = new File(); 
path.nativePath = "C:\\AIR~1"; 
path.canonicalize(); 
trace(path.nativePath); // C:\AIR Test

パッケージおよびシンボリックリンクの操作

各種のオペレーティングシステムで、パッケージファイルおよびシンボリックリンクファイルがサポートされています。

パッケージ - Macintosh では、ディレクトリをパッケージとして指定して、Macintosh Finder にディレクトリではなく単一のファイルとして表示することができます。

シンボリックリンク - Macintosh、Linux および Windows Vista では、シンボリックリンクがサポートされています。シンボリックリンクを使用すると、ファイルからディスク上の別のファイルやディレクトリを参照できるようになります。シンボリックリンクはエイリアスに似ていますが、同じではありません。エイリアスは常に(ディレクトリではなく)ファイルとして報告され、エイリアスまたはショートカットに対して読み取りまたは書き込みを行っても、その参照先である元のファイルまたはディレクトリが影響を受けることはありません。これに対し、シンボリックリンクは、参照先のファイルまたはディレクトリとまったく同じように動作します。ファイルまたはディレクトリとして報告することができ、シンボリックリンクに対して読み取りまたは書き込みを行うと、シンボリックリンク自体ではなく、参照先のファイルまたはディレクトリに反映されます。 さらに、Windows では、ジャンクションポイント(NTFS ファイルシステムで使用される)を参照する File オブジェクトの isSymbolicLink プロパティが true に設定されています。

File クラスには、File オブジェクトがパッケージまたはシンボリックリンクを参照しているかどうかを確認するための isPackage プロパティおよび isSymbolicLink プロパティが用意されています。

次のコードでは、ユーザのデスクトップディレクトリを繰り返し処理して、パッケージではないサブディレクトリの一覧を出力します。

var desktopNodes:Array = File.desktopDirectory.getDirectoryListing(); 
for (var i:uint = 0; i < desktopNodes.length; i++)  
{ 
    if (desktopNodes[i].isDirectory && !!desktopNodes[i].isPackage) 
    { 
        trace(desktopNodes[i].name); 
    } 
} 

次のコードでは、ユーザのデスクトップディレクトリを繰り返し処理して、シンボリックリンクではないファイルおよびディレクトリの一覧を出力します。

var desktopNodes:Array = File.desktopDirectory.getDirectoryListing(); 
for (var i:uint = 0; i < desktopNodes.length; i++)  
{ 
    if (!desktopNodes[i].isSymbolicLink) 
    { 
        trace(desktopNodes[i].name); 
    } 
} 

canonicalize() メソッドでは、シンボリックリンクのパスを、そのリンクの参照先のファイルまたはディレクトリを参照するように変更します。次のコードでは、ユーザのデスクトップディレクトリを繰り返し処理して、シンボリックリンクであるファイルによって参照されているパスを報告します。

var desktopNodes:Array = File.desktopDirectory.getDirectoryListing(); 
for (var i:uint = 0; i < desktopNodes.length; i++)  
{ 
    if (desktopNodes[i].isSymbolicLink) 
    { 
        var linkNode:File = desktopNodes[i] as File; 
        linkNode.canonicalize(); 
        trace(linkNode.nativePath); 
    } 
} 

ボリューム上の利用可能な領域の特定

File オブジェクトの spaceAvailable プロパティは、ファイルの場所として使用できる領域をバイト単位で示します。例えば、次のコードでは、アプリケーション記憶領域ディレクトリで利用可能な領域を確認します。

trace(File.applicationStorageDirectory.spaceAvailable); 

File オブジェクトがディレクトリを参照している場合、spaceAvailable プロパティはファイルが使用できるディレクトリ内の領域を示します。File オブジェクトがファイルを参照している場合、spaceAvailable プロパティはファイルが増大可能な領域を示します。ファイルの場所が存在しない場合、spaceAvailable プロパティは 0 に設定されます。File オブジェクトがシンボリックリンクを参照している場合、spaceAvailable プロパティは、シンボリックリンクが指している場所で利用可能な領域に設定されます。

通常、ディレクトリやファイルに利用可能な領域は、ディレクトリまたはファイルを格納するボリュームで利用可能な領域と同じです。ただし、利用可能な領域では、クォータやディレクトリごとの制限が考慮される場合があります。

ファイルやディレクトリをボリュームに追加するには、一般的に、実際のファイルのサイズやディレクトリのコンテンツのサイズよりも大きな領域が必要です。例えば、オペレーティングシステムの場合、インデックス情報を格納するためにより多くの領域が必要になる可能性があります。また、必要なディスクセクタのために、追加の領域が使用される場合があります。さらに、利用可能な領域は動的に変化します。したがって、報告されたすべての領域をファイル記憶域として割り当てることはできません。ファイルシステムへの書き込みについては、ファイルの読み取りと書き込みを参照してください。