Работа с объектами File в AIRAdobe AIR 1.0 и более новых версий Объект File является указателем на файл или каталог в файловой системе. Класс File является расширением класса FileReference. Класс FileReference, встречающийся в проигрывателе Adobe® Flash® Player и среде AIR™, является указателем на файл, но в класс File добавлены свойства и методы, из соображений безопасности не представленные в проигрывателе Flash Player (при проигрывании SWF-файла в обозревателе). О классе FileКласс File имеет целый ряд применений:
Объект File, указывающий путь к файлу, можно использовать для чтения и записи данных с помощью класса FileStream. Объект File может указывать путь к еще не существующему файлу или каталогу. В этом случае этот объект можно использовать для создания файла или каталога. Пути к объектам FileУ каждого объекта File есть два свойства, определяющие его путь:
Класс File включает в себя статические свойства для указания на стандартные каталоги в ОС Mac OS, Windows и Linux. К таким свойствам относятся:
Примечание. Если платформа не определяет стандартные каталоги рабочего стола, каталог документов пользователя и каталог пользователя, File.documentsDirectory, File.desktopDirectory и File.userDirectory могут указывать на один и тот же каталог.
В различных операционных системах эти свойства имеют разные значения. Например, в ОС Mac и Windows собственные пути к каталогу рабочего стола пользователя различаются. Однако свойство File.desktopDirectory указывает соответствующий путь к каталогу на каждой платформе. При создании приложений для работы на различных платформах используйте эти свойства как основу для указания на другие каталоги и файлы, используемые приложением. Затем используйте метод resolvePath() для коррекции пути. Например, данный код указывает на файл preferences.xml в каталоге хранилища приложения: var prefsFile:File = File.applicationStorageDirectory;
prefsFile = prefsFile.resolvePath("preferences.xml");
Хотя класс File позволяет указывать определенный путь к файлу, он может привести к приложениям, которые не могут работать на разных платформах. Например, путь C:\Documents and Settings\joe\ работает только в ОС Windows. По этим причинам лучше использовать статические свойства класса File, такие как File.documentsDirectory.
Фактические собственные пути к этим каталогам будут определяться операционной системой и конфигурацией компьютера. Пути, показанные в данной таблице, являются типовыми примерами. При ссылке на эти каталоги всегда следует использовать соответствующие статические свойства класса File. В приложении AIR значения свойств applicationID и filename, приведенные в таблице, взяты из дескриптора приложения. Если в дескрипторе приложения указано свойство publisher ID, идентификатор издателя будет добавлен к идентификатору приложения в этих путях. Значением свойства userName является имя учетной записи пользователя, выполняющего установку. Вид каталога приложений AIR для телевизионных устройствВ целях обеспечения защиты системных файлов в среде AIR для телевизионных устройств приложения AIR имеют доступ только к ограниченному списку каталогов. Среда AIR на телевизионных устройствах запрещает приложениям доступ к любым другим каталогам. Кроме того, среда AIR для телевизионных устройств изолирует пользовательские данные каждого из приложений AIR. Приложения AIR используют названия каталогов, которые предназначены только для использования в ActionScript 3.0. Они не являются реальными именами каталогов на устройстве. Среда AIR для телевизионных устройств сопоставляет эти имена каталогов ActionScript 3.0 с реальными каталогами на устройстве. Этот процесс сопоставления позволяет защитить приложения AIR для телевизионных устройств от злоумышленного и случайного обращения к локальным файлам, которые не принадлежат приложениям. В ActionScript 3.0 используются следующие имена каталогов:
Если приложение пытается получить доступ к запрещенному каталогу, среда выполнения генерирует исключение, которое может перехватить код ActionScript. В следующей таблице показаны значения File.nativePath для различных свойств и методов File. Значения отражают ограниченный доступ приложения к файловой системе устройства.
Также обратите внимание на поведение следующих методов в среде AIR для телевизионных устройств.
Объект File, указывающий на каталогСуществует ряд способов настроить объект File так, чтобы он указывал на каталог. Указание на начальный каталог пользователяОбъект File может указывать на начальный каталог пользователя. В приведенном ниже коде объект File указывает на подкаталог AIR Test начального каталога: var file:File = File.userDirectory.resolvePath("AIR Test");
Указание на каталог документов пользователяОбъект File может указывать на каталог документов пользователя. В приведенном ниже коде объект File указывает на подкаталог AIR Test каталога документов: var file:File = File.documentsDirectory.resolvePath("AIR Test");
Указание на каталог рабочего стола пользователяОбъект File может указывать на каталог рабочего стола. В приведенном ниже коде объект File указывает на подкаталог AIR Test рабочего стола: var file:File = File.desktopDirectory.resolvePath("AIR Test");
Указание на каталог хранилища приложенияОбъект File может указывать на каталог хранилища приложения. В каждом приложении AIR есть путь, определяющий каталог хранилища данных этого приложения. Этот каталог уникален для каждого приложения и каждого пользователя. Его можно использовать для хранения информации, связанной с конкретным пользователем или приложением (например, файлы данных или настроек). Например, в приведенном ниже коде объект File указывает на файл настроек prefs.xml, содержащийся в каталоге хранилища приложения: var file:File = File.applicationStorageDirectory;
file = file.resolvePath("prefs.xml");
Местоположение каталога хранилища программы обычно складывается из имени пользователя и идентификатора приложения. Представленная ниже информация о местоположениях в файловой системе будет полезна при выполнении отладки приложения. Для нахождения файлов в этом каталоге всегда используйте свойство File.applicationStorage или схему URI app-storage:
Примечание. Если у приложения имеется идентификатор издателя, то он также используется для указания пути к каталогу хранилища этого приложения.
URL-адрес (и свойство url) объекта File, созданного с помощью File.applicationStorageDirectory, использует схему URL-адресов app-storage (см. раздел Поддерживаемые AIR схемы URL-адресов), как показано ниже: var dir:File = File.applicationStorageDirectory;
dir = dir.resolvePath("preferences");
trace(dir.url); // app-storage:/preferences
Указание на каталог приложенияОбъект File может указывать на каталог, в который установлено приложение (т.н. каталог приложения). На этот каталог можно ссылаться с помощью свойства File.applicationDirectory. В нем можно найти файл дескриптора и другие ресурсы, установленные вместе с приложением. Например, в приведенном ниже коде объект File указывает на каталог images внутри каталога приложения: var dir:File = File.applicationDirectory;
dir = dir.resolvePath("images");
URL-адрес (и свойство url) объекта File, созданного с помощью File.applicationDirectory, использует схему URL-адресов app (см. раздел Поддерживаемые AIR схемы URL-адресов), как показано ниже: var dir:File = File.applicationDirectory;
dir = dir.resolvePath("images");
trace(dir.url); // app:/images
Примечание. В Android свойство nativePath не может быть использовано для получения доступа к файлам в пакете приложения. Свойство nativePath представляет собой пустую строку. При обращении к файлам в каталоге приложения всегда используйте URL вместо собственного пути.
Указание на корневой каталог файловой системыМетод File.getRootDirectories() составляет список всех корневых томов, таких как «C:», и подключенных томов на компьютере Windows. В ОС Mac и Linux этот метод всегда возвращает уникальный корневой каталог компьютера (каталог «/»). Метод StorageVolumeInfo.getStorageVolumes() предоставляет дополнительные сведения о подключенных томах запоминающих устройств (см. раздел Работа с томами запоминающих устройств). Примечание. В Android отсутствует доступ для чтения корневого каталога файловой системы. Возвращается объект File, указывающий на каталог с собственным путем «/», однако свойства этого объекта не имеют точных значений. Например, свойство spaceAvailable всегда равно 0.
Указание на явно заданный каталогОбъект File может указывать на явно заданный каталог. Для этого нужно задать свойство nativePath объекта File, как показано в примере ниже (в Windows): var file:File = new File(); file.nativePath = "C:\\AIR Test"; Важно: такое указание явного пути может привести к тому, что код не будет работать на разных платформах. Например, предыдущий пример работоспособен только в ОС Windows. Для определения местонахождения каталога, работающего с разными платформами, можно использовать статические свойства объекта File, например File.applicationStorageDirectory. Для навигации по относительному пути используйте метод resolvePath() (см. следующий раздел). Навигация с использованием относительных путейМетод resolvePath() может использоваться для получения пути относительно другого пути. Например, объект File указывает на подкаталог AIR Test начального каталога пользователя. var file:File = File.userDirectory;
file = file.resolvePath("AIR Test");
Свойство url объекта File может указывать на каталог на основе URL-строки, как показано ниже: var urlStr:String = "file:///C:/AIR Test/"; var file:File = new File() file.url = urlStr; Дополнительные сведения см. в разделе «Изменение путей к файлу». Разрешение пользователю обзора для выбора каталогаКласс 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);
}
Примечание. В Android метод browseForDirectory() не поддерживается. Вызов этого метода не дает никаких результатов. Моментально отправляется событие cancel. Чтобы разрешить пользователям выбирать каталог, следует использовать вместо этого пользовательское диалоговое окно, определенное приложением.
Указание на каталог, из которого запускается приложениеРасположение каталога, из которого запускается приложение, можно получить, проверив свойство currentDirectory объекта InvokeEvent, отправляемого при запуске приложения. Дополнительные сведения см. в разделе «Захват аргументов командной строки». Объект File, указывающий на файлСуществует несколько способов задания файла, на который указывает объект File. Указание на явно заданный путь к файлуВажно: указание явного пути может привести к тому, что код не будет работать на разных платформах. Например, использование пути C:/foo.txt применимо только в ОС Windows. Для определения местонахождения каталога, работающего с разными платформами, можно использовать статические свойства объекта File, например File.applicationStorageDirectory. Для навигации по относительному пути используйте метод resolvePath() (см. раздел «Изменение путей к файлу»). Свойство url объекта File может указывать на файл или каталог на основе URL-строки, как показано ниже: var urlStr:String = "file:///C:/AIR Test/test.txt"; var file:File = new File() file.url = urlStr; Также можно передать функции конструктора File() URL-адрес, как показано ниже: var urlStr:String = "file:///C:/AIR Test/test.txt"; var file:File = new File(urlStr); Свойство url всегда возвращает URL в формате URI (например, пробелы замещаются знаками "%20): file.url = "file:///c:/AIR Test"; trace(file.url); // file:///c:/AIR%20Test Также свойство nativePath объекта File можно использовать для явного задания пути. Например, если приведенный ниже код запустить на компьютере под управлением Windows, то объект File будет указывать на файл text.txt в подкаталоге AIR Test на диске «С:»: 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 можно также использовать обратную косую черту (\), но при этом приложение может не работать на других платформах. Дополнительные сведения см. в разделе «Изменение путей к файлу». Нумерация файлов в каталогеС помощью метода getDirectoryListing() объекта File можно получить массив объектов File, указывающих на файлы и подкаталоги в корневом каталоге. Дополнительные сведения см. в разделе «Нумерация каталогов». Разрешение пользователю обзора для выбора файлаКласс File включает следующие методы, выводящие системное диалоговое окно, в котором пользователь может выбрать файл и назначить его объекту:
Все они асинхронны. Методы browseForOpen() и browseForSave() отправляют событие select, когда пользователь выбирает файл (или, в случае метода browseForSave(), целевой путь). В случае методов 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);
}
Если при вызове метода browse в приложении уже открыто другое диалоговое окно, среда выполнения генерирует исключение Error. Изменение путей к файлуПуть к существующему объекту File можно изменить, вызвав метод resolvePath() или изменив свойство nativePath или url объекта, как показано ниже (для 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 можно также использовать обратную косую черту (\), но при этом приложение может не работать на других платформах. Поддерживаемые AIR схемы URL-адресовВ AIR для определения свойства url объекта File могут использоваться следующие схемы URL-адресов.
Нахождение одного пути к файлу относительно другогоМетод getRelativePath() может использоваться для нахождения пути к одному файлу относительно другого: 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() — 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 и Mac OS не учитывают регистр. В примере ниже два объекта 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() также можно использовать для преобразования коротких имен файлов (имен «8.3») в длинные имена в Windows, как показано ниже: var path:File = new File(); path.nativePath = "C:\\AIR~1"; path.canonicalize(); trace(path.nativePath); // C:\AIR Test Работа с пакетами и символьными ссылкамиРазные операционные системы поддерживают пакетные файлы и файлы символьных ссылок: Пакеты. В Mac OS каталог может быть назначен пакетом и в этом случае будет отображаться в файловом менеджере Mac OS Finder как единый файл, а не как каталог. Символьные ссылки. Символьные ссылки поддерживаются в Mac OS, Linux и Windows Vista. С помощью символьных ссылок один файл может ссылаться на другой файл или каталог на диске. Не путайте символьные ссылки с псевдонимами. Псевдонимы всегда считаются файлами (не каталогами), а чтение или запись псевдонимов и ярлыков никаким образом не изменяет файлы, на которые они указывают. Символьная ссылка, в свою очередь, повторяет поведение файла или каталога, на который она указывает. Она может считаться файлом или каталогом, а при чтении и записи символьной ссылки изменения будут производиться над самим файлом, на который она указывает, а не над ссылкой. Кроме того, в Windows для свойства isSymbolicLink объекта File, ссылающегося на узловой пункт (используется в файловой системе NTFS), устанавливается значение true. Класс File включает свойства isPackage и isSymbolicLink, позволяющие проверить, ссылается ли объект File на пакет или символьную ссылку. В приведенном ниже коде каталог рабочего стола просматривается и создается список подкаталогов, не являющихся пакетами: 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);
}
}
Определение свободного места на томеСвойство spaceAvailable объекта File указывает на количество свободного места в расположении объекта File в байтах. Например, в приведенном ниже коде проверяется свободное место в каталоге хранилища приложения. trace(File.applicationStorageDirectory.spaceAvailable); Если объект File ссылается на каталог, свойство spaceAvailable указывает объем свободного места, доступного для использования файлом. Если объект File ссылается на файл, свойство spaceAvailable обозначает объем, который потенциально может занять файл. Если расположения файла не существует, свойство spaceAvailable принимает значение 0. Если объект File ссылается на символьную ссылку, свойство spaceAvailable означает свободный объем в том месте, на которое указывает символьная ссылка. Как правило, объем, который потенциально может занять файл, равен свободному объему всего тома, на котором содержится файл или каталог. Тем не менее при подсчете свободного места могут учитываться квоты и ограничения на каждый каталог. При добавлении к тому файла или каталога, как правило, требуется чуть больше места, чем сам размер файла или каталога. Например, операционной системе может потребоваться больше места для хранения индексов. Либо секторы дисков могут задействовать дополнительное место. Кроме того, объем свободного места изменяется динамически. Поэтому не следует ожидать, что вы сможете использовать все заявленное свободное место. Сведения о записи в файловую систему см. в разделе «Чтение и запись файлов». Метод StorageVolumeInfo.getStorageVolumes() предоставляет дополнительные сведения о подключенных томах запоминающих устройств (см. раздел Работа с томами запоминающих устройств). Открытие файлов с помощью выбранной по умолчанию системной программыВ AIR 2 можно открыть файл с помощью программы, зарегистрированной в операционной системе для его открытия. Например, приложение AIR может открыть DOC-файл с помощью программы, которая зарегистрирована для его открытия. Используйте метод openWithDefaultApplication() объекта File для открытия файла. Например, следующий код открывает файл test.doc на рабочем столе пользователя с помощью программы, выбранной по умолчанию для файлов DOC: var file:File = File.deskopDirectory;
file = file.resolvePath("test.doc");
file.openWithDefaultApplication();
Примечание. В ОС Linux тип файла MIME (а не расширение) определяет приложение по умолчанию для файла.
Следующий код дает пользователю возможность перейти к mp3-файлу и открыть его в приложении, которое выбрано по умолчанию для воспроизведения mp3-файлов: var file:File = File.documentsDirectory;
var mp3Filter:FileFilter = new FileFilter("MP3 Files", "*.mp3");
file.browseForOpen("Open", [mp3Filter]);
file.addEventListener(Event.SELECT, fileSelected);
function fileSelected(e:Event):void
{
file.openWithDefaultApplication();
}
Метод openWithDefaultApplication() нельзя использовать по отношению к файлам, расположенным в каталоге приложения. AIR не позволяет применять метод openWithDefaultApplication() для открытия ряда файлов. В Windows AIR запрещает открывать файлы определенных типов (например, EXE или BAT). В ОС Mac OS и Linux среда AIR предотвращает открытие файлов в определенном приложении. (Включая приложения «Терминал» и AppletLauncher в ОС Mac OS и csh, bash или ruby в ОС Linux.) Попытка открыть один из этих файлов с помощью метода openWithDefaultApplication() приводит к появлению исключения. Полный список запрещаемых типов файлов см. в записи справочника по языку для метода File.openWithDefaultApplication(). Примечание. Это ограничение не распространяется на приложение AIR, установленное с помощью собственной программы установки (расширенного настольного приложения); см. раздел «Упаковка приложения AIR в собственной программе установки».
|
|