|
|
File オブジェクトの操作目次 [非表示]File オブジェクトは、ファイルシステム内のファイルまたはディレクトリへのポインタです。 File クラスは FileReference クラスを拡張します。FileReference クラス(Adobe® Flash® Player および AIR で利用可能)はファイルへのポインタを表しますが、File クラスには、セキュリティ上の考慮事項により Flash Player(ブラウザで実行している SWF ファイル)で公開されていない追加のプロパティおよびメソッドがあります。 File クラスについてFile クラスを使用して以下を実行できます。
File オブジェクトでファイルパスを参照すると、FileStream クラスでそれを使用してファイルデータの読み取りと書き込みができるようになります。 File オブジェクトでは、まだ存在しないファイルまたはディレクトリのパスを参照できます。このような File オブジェクトは、ファイルまたはディレクトリの作成に使用できます。 File オブジェクトのパス各 File オブジェクトには、そのオブジェクトのパスをそれぞれ定義する 2 つのプロパティがあります。
File クラスには、Macintosh、Windows および Linux の標準のディレクトリを参照するための静的プロパティが含まれます。これらのプロパティは次のとおりです。
これらのプロパティには、様々なオペレーティングシステムで意味のある値が設定されます。例えば、Mac OS、Linux および Windows にはそれぞれ、ユーザのデスクトップディレクトリへの異なるネイティブパスがあります。ただし、File.desktopDirectory プロパティは、これらの各プラットフォーム上の正しいデスクトップディレクトリパスを参照します。複数のプラットフォームにわたって正常に機能するアプリケーションを作成するには、アプリケーションが使用する他のディレクトリやファイルを参照する土台としてこれらのプロパティを使用します。次に、resolvePath() メソッドを使用してパスの詳細を設定します。例えば、次のコードは、アプリケーション記憶領域ディレクトリの preferences.xml ファイルを参照しています。 var prefsFile:File = air.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 = air.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 = air.File.documentsDirectory.resolvePath("AIR Test");
デスクトップディレクトリの参照File オブジェクトでデスクトップを参照できます。次のコードでは、デスクトップの AIR Test サブディレクトリを参照するように File オブジェクトを設定しています。 var file = air.File.desktopDirectory.resolvePath("AIR Test");
アプリケーション記憶領域ディレクトリの参照File オブジェクトでアプリケーション記憶領域ディレクトリを参照できます。AIR アプリケーションにはそれぞれ、アプリケーション記憶領域ディレクトリを定義する一意のパスが関連付けられています。このディレクトリは、アプリケーションおよびユーザごとに一意に割り当てられます。このディレクトリは、ユーザおよびアプリケーションに固有のデータ(ユーザデータや環境設定ファイルなど)を格納するために使用できます。例えば、次のコードでは、アプリケーション記憶領域ディレクトリに格納されている prefs.xml という環境設定ファイルを File オブジェクトで参照します。 var file = air.File.applicationStorageDirectory;
file = file.resolvePath("prefs.xml");
アプリケーション記憶領域ディレクトリの場所は、ユーザ名、アプリケーション ID および発行者 ID に基づきます。
url で作成された File オブジェクトの (および File.applicationStorageDirectoryurl プロパティ)では、次のように app-storage URL スキーム(サポートされる URL スキームを参照)が使用されます。 var dir = air.File.applicationStorageDirectory;
dir = dir.resolvePath("prefs.xml");
air.trace(dir.url); // app-storage:/preferences
アプリケーションディレクトリの参照File オブジェクトで、アプリケーションがインストールされたディレクトリ(アプリケーションディレクトリ)を参照できます。このディレクトリを参照するには、File.applicationDirectory プロパティを使用します。このディレクトリでは、アプリケーション記述ファイルなど、アプリケーションと共にインストールされたリソースを確認できます。例えば、次のコードでは、アプリケーションディレクトリにある images というディレクトリを File オブジェクトで参照します。 var dir = air.File.applicationDirectory;
dir = dir.resolvePath("images");
url で作成された File オブジェクトの (および File.applicationDirectoryurl プロパティ)では、次のように app URL スキーム(サポートされる URL スキームを参照)が使用されます。 var dir = air.File.applicationDirectory;
dir = dir.resolvePath("images");
air.trace(dir.url); // app:/images
ファイルシステムのルートの参照File.getRootDirectories() メソッドは、すべてのルートボリュームの一覧を出力します。Windows コンピュータの場合は、C: およびマウントされたボリュームが含まれます。Macintosh および Linux の場合は、常にマシンの一意のルートディレクトリ(「/」ディレクトリ)が返されます。 明示的なディレクトリの参照File オブジェクトの nativePath プロパティを設定することにより、File オブジェクトで明示的なディレクトリを参照できます。Windows の場合の例を次に示します。 var file = new air.File(); file.nativePath = "C:\\AIR Test\"; 重要: このような方法で明示的なパスを参照すると、コードが複数のプラットフォームにわたって機能しなくなる可能性があります。例えば、前の例は Windows 上でのみ機能します。クロスプラットフォームで機能するディレクトリを見つけるには、File.applicationStorageDirectory などの File オブジェクトの静的プロパティを使用する必要があります。次に、resolvePath() メソッド(次の節を参照)を使用して、相対パスに移動します。 相対パスのナビゲーションresolvePath() メソッドを使用すると、別の特定のパスを基準とした相対的なパスを取得できます。例えば、次のコードでは、ユーザのホームディレクトリの AIR Test サブディレクトリを参照するように File オブジェクトを設定しています。 var file = air.File.userDirectory;
file = file.resolvePath("AIR Test");
また、次のように、File オブジェクトの url プロパティを使用すると、URL ストリングに基づいてディレクトリを参照することもできます。 var urlStr = "file:///C:/AIR Test/"; var file = new air.File() file.url = urlStr; 詳しくは、File パスの変更を参照してください。 参照するディレクトリの選択File クラスの browseForDirectory() メソッドを使用すると、ユーザがオブジェクトに割り当てるディレクトリを選択できるシステムダイアログボックスを表示できます。browseForDirectory() メソッドは、非同期のメソッドです。このメソッドでは、ユーザがディレクトリを選択して「開く」ボタンをクリックすると select イベントを送出し、ユーザが「キャンセル」ボタンをクリックすると cancel イベントを送出します。 例えば、次のコードでは、ユーザがディレクトリを選択できるようにし、その選択に応じたディレクトリパスを出力します。 var file = new air.File();
file.addEventListener(air.Event.SELECT, dirSelected);
file.browseForDirectory("Select a directory");
function dirSelected(event) {
alert(file.nativePath);
}
アプリケーションを起動したディレクトリの参照アプリケーションを起動したディレクトリの場所を取得するには、アプリケーションの起動時に送出された InvokeEvent オブジェクトの currentDirectory プロパティを確認します。詳しくは、コマンドライン引数のキャプチャを参照してください。 File オブジェクトでのファイルの参照File オブジェクトで参照するファイルを設定するには、様々な方法があります。 明示的なファイルパスの参照重要: 明示的なパスを参照すると、コードが複数のプラットフォームにわたって機能しなくなる可能性があります。例えば、C:¥foo.txt というパスは、Windows 上でのみ機能します。クロスプラットフォームで機能するディレクトリを見つけるには、File.applicationStorageDirectory などの File オブジェクトの静的プロパティを使用する必要があります。次に、resolvePath() メソッド(File パスの変更を参照)を使用して、相対パスに移動します。 次のように、File オブジェクトの url プロパティを使用すると、URL ストリングに基づいてファイルまたはディレクトリを参照できます。 var urlStr = "file:///C:/AIR Test/test.txt"; var file = new air.File() file.url = urlStr; URL は、次のように File() コンストラクタ関数に渡すこともできます。 var urlStr = "file:///C:/AIR Test/test.txt"; var file = new air.File(urlStr); url プロパティでは、常に URI エンコード形式の URL が返されます(例えば、スペースは "%20 に置き換えられます)。 file.url = "file:///c:/AIR Test"; alert(file.url); // file:///c:/AIR%20Test また、File オブジェクトの nativePath プロパティを使用して明示的なパスを設定することもできます。例えば、次のコードを Windows コンピュータで実行すると、C: ドライブの AIR Test サブディレクトリにある test.txt ファイルを参照するように File オブジェクトが設定されます。 var file = new air.File(); file.nativePath = "C:/AIR Test/test.txt"; このパスは、次のように File() コンストラクタ関数に渡すこともできます。 var file = new air.File("C:/AIR Test/test.txt");
nativePath プロパティのパス区切り文字としては、スラッシュ(/)を使用します。Windows では、円記号(¥)も使用できますが、その場合、アプリケーションが複数のプラットフォームにわたって機能しなくなる可能性があります。 詳しくは、File パスの変更を参照してください。 ディレクトリ内のファイルの列挙File オブジェクトの getDirectoryListing() メソッドを使用すると、ディレクトリのルートレベルにあるファイルおよびサブディレクトリを参照する File オブジェクトの配列を取得することができます。詳しくは、ディレクトリの列挙を参照してください。 参照するファイルの選択File クラスには、ユーザがオブジェクトに割り当てるファイルを選択できるシステムダイアログボックスを表示する以下のメソッドがあります。
これらのメソッドでは、いずれも非同期で処理が行われます。browseForOpen() メソッドと browseForSave() メソッドでは、ユーザがファイル(browseForSave() の場合はターゲットパス)を選択すると select イベントを送出します。browseForOpen() メソッドと browseForSave() メソッドのターゲットの File オブジェクトは、その選択に応じて、選択されたファイルを参照します。browseForOpenMultiple () メソッドでは、ユーザがファイルを選択すると selectMultiple イベントを送出します。selectMultiple イベントは FileListEvent 型のイベントで、その files プロパティに(選択されたファイルを参照する) File オブジェクトの配列が格納されます。 例えば、次のコードでは、ファイルを選択するための「開く」ダイアログボックスが表示されます。 var fileToOpen = air.File.documentsDirectory;
selectTextFile(fileToOpen);
function selectTextFile(root)
{
var txtFilter = new air.FileFilter("Text", "*.as;*.css;*.html;*.txt;*.xml");
root.browseForOpen("Open", new window.runtime.Array(txtFilter));
root.addEventListener(air.Event.SELECT, fileSelected);
}
function fileSelected(event)
{
trace(fileToOpen.nativePath);
}
アプリケーションで別の参照ダイアログボックスが開かれている場合に参照メソッドを呼び出すと、ランタイムから Error 例外がスローされます。 File パスの変更resolvePath() メソッドを呼び出すか、オブジェクトの nativePath プロパティまたは url プロパティを変更することにより、既存の File オブジェクトのパスを変更することもできます。Windows の場合の例を次に示します。 file1 = air.File.documentsDirectory;
file1 = file1.resolvePath("AIR Test");
alert(file1.nativePath); // C:\Documents and Settings\userName\My Documents\AIR Test
var file2 = air.File.documentsDirectory;
file2 = file2.resolvePath("..");
alert(file2.nativePath); // C:\Documents and Settings\userName
var file3 = air.File.documentsDirectory;
file3.nativePath += "/subdirectory";
alert(file3.nativePath); // C:\Documents and Settings\userName\My Documents\subdirectory
var file4 = new air.File();
file4.url = "file:///c:/AIR Test/test.txt";
alert(file4.nativePath); // C:\AIR Test\test.txt
nativePath プロパティを使用する場合、ディレクトリの区切り文字としてスラッシュ(/)を使用します。Windows では、円記号(¥)も使用できますが、コードがクロスプラットフォームで機能しなくなるため、それは避ける必要があります。 サポートされる URL スキームFile オブジェクトの url プロパティの定義では、以下のいずれかの URL スキームを使用できます。
2 つのファイル間の相対パスの取得getRelativePath() メソッドを使用すると、2 つのファイル間の相対パスを取得できます。 var file1 = air.File.documentsDirectory
file1 = file1.resolvePath("AIR Test");
var file2 = air.File.documentsDirectory
file2 = file2.resolvePath("AIR Test/bob/test.txt");
alert(file1.getRelativePath(file2)); // bob/test.txt
getRelativePath() メソッドの 2 番目のパラメータである useDotDot> パラメータを使用すると、.. シンタックスを結果として返して、親ディレクトリを示すことができます。 var file1 = air.File.documentsDirectory;
file1 = file1.resolvePath("AIR Test");
var file2 = air.File.documentsDirectory;
file2 = file2.resolvePath("AIR Test/bob/test.txt");
var file3 = air.File.documentsDirectory;
file3 = file3.resolvePath("AIR Test/susan/test.txt");
alert(file2.getRelativePath(file1, true)); // ../..
alert(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 = air.File.documentsDirectory;
file = file.resolvePath("AIR test");
trace(file.nativePath); // ... AIR test
file.canonicalize();
alert(file.nativePath); // ... AIR Test
canonicalize() () メソッドでは、大文字と小文字が区別された正しいファイル名またはディレクトリ名を使用するように nativePath プロパティが変換されます。Linux などの大文字と小文字を区別するファイルシステムでは、大文字と小文字の区別だけが異なる複数のファイルが存在する場合、canonicalize() メソッドにより、最初に見つかったファイル(ファイルシステムによって決められた順序による)に合わせてパスが調整されます。 canonicalize() メソッドは、次のように、Windows で短いファイル名(「8.3」形式の名前)を長いファイル名に変換する場合にも使用できます。 var path = new air.File(); path.nativePath = "C:\\AIR~1"; path.canonicalize(); alert(path.nativePath); // C:\AIR Test パッケージおよびシンボリックリンクの操作各種のオペレーティングシステムで、パッケージファイルおよびシンボリックリンクファイルがサポートされています。 パッケージ - Macintosh では、ディレクトリをパッケージとして指定して、Macintosh Finder にディレクトリではなく単一のファイルとして表示することができます。 シンボリックリンク - Macintosh、Linux および Windows Vista では、シンボリックリンクがサポートされています。シンボリックリンクを使用すると、ファイルからディスク上の別のファイルやディレクトリを参照できるようになります。シンボリックリンクはエイリアスに似ていますが、同じではありません。エイリアスは常に(ディレクトリではなく)ファイルとして報告され、エイリアスまたはショートカットに対して読み取りまたは書き込みを行っても、その参照先である元のファイルまたはディレクトリが影響を受けることはありません。これに対し、シンボリックリンクは、参照先のファイルまたはディレクトリとまったく同じように動作します。ファイルまたはディレクトリとして報告することができ、シンボリックリンクに対して読み取りまたは書き込みを行うと、シンボリックリンク自体ではなく、参照先のファイルまたはディレクトリに反映されます。 さらに、Windows では、ジャンクションポイント(NTFS ファイルシステムで使用される)を参照する File オブジェクトの isSymbolicLink プロパティが true に設定されています。 File クラスには、File オブジェクトがパッケージまたはシンボリックリンクを参照しているかどうかを確認するための isPackage プロパティおよび isSymbolicLink プロパティが用意されています。 次のコードでは、ユーザのデスクトップディレクトリを繰り返し処理して、パッケージではないサブディレクトリの一覧を出力します。 var desktopNodes = air.File.desktopDirectory.getDirectoryListing();
for (i = 0; i < desktopNodes.length; i++)
{
if (desktopNodes[i].isDirectory && !!desktopNodes[i].isPackage)
{
air.trace(desktopNodes[i].name);
}
}
次のコードでは、ユーザのデスクトップディレクトリを繰り返し処理して、シンボリックリンクではないファイルおよびディレクトリの一覧を出力します。 var desktopNodes = air.File.desktopDirectory.getDirectoryListing();
for (i = 0; i < desktopNodes.length; i++)
{
if (!desktopNodes[i].isSymbolicLink)
{
air.trace(desktopNodes[i].name);
}
}
canonicalize() メソッドでは、シンボリックリンクのパスを、そのリンクの参照先のファイルまたはディレクトリを参照するように変更します。次のコードでは、ユーザのデスクトップディレクトリを繰り返し処理して、シンボリックリンクであるファイルによって参照されているパスを報告します。 var desktopNodes = air.File.desktopDirectory.getDirectoryListing();
for (i = 0; i < desktopNodes.length; i++)
{
if (desktopNodes[i].isSymbolicLink)
{
var linkNode = desktopNodes[i];
linkNode.canonicalize();
air.trace(desktopNodes[i].name);
}
}
ボリューム上の利用可能な領域の特定File オブジェクトの spaceAvailable プロパティは、ファイルの場所として使用できる領域をバイト単位で示します。例えば、次のコードでは、アプリケーション記憶領域ディレクトリで利用可能な領域を確認します。 air.trace(air.File.applicationStorageDirectory.spaceAvailable); File オブジェクトがディレクトリを参照している場合、spaceAvailable プロパティはファイルが使用できるディレクトリ内の領域を示します。File オブジェクトがファイルを参照している場合、spaceAvailable プロパティはファイルが増大可能な領域を示します。ファイルの場所が存在しない場合、spaceAvailable プロパティは 0 に設定されます。File オブジェクトがシンボリックリンクを参照している場合、spaceAvailable プロパティは、シンボリックリンクが指している場所で利用可能な領域に設定されます。 通常、ディレクトリやファイルに利用可能な領域は、ディレクトリまたはファイルを格納するボリュームで利用可能な領域と同じです。ただし、利用可能な領域では、クォータやディレクトリごとの制限が考慮される場合があります。 ファイルやディレクトリをボリュームに追加するには、一般的に、実際のファイルのサイズやディレクトリのコンテンツのサイズよりも大きな領域が必要です。例えば、オペレーティングシステムの場合、インデックス情報を格納するためにより多くの領域が必要になる可能性があります。また、必要なディスクセクタのために、追加の領域が使用される場合があります。さらに、利用可能な領域は動的に変化します。したがって、報告されたすべての領域をファイル記憶域として割り当てることはできません。ファイルシステムへの書き込みについては、ファイルの読み取りと書き込みを参照してください。 |