Работа с файлами и директориями.
Cтатья требует увереного знания AS3.
В AIR мы можем работать с файловой системой, а так же считывать текст из текстового документа, создавать и записывать. Для чего это может понадобиться решать вам, лично я использовал такую возможность для создания одного большого TODO листа. Часто видел у знакомых кучу текстовых документов с невнятными названия типа «Не ленись, прочти» , «А это гениальная идея» или «Обязательно сделай». В общем как вы понимаете разбиратся с такой кучей файлов долго, а если их много то очень долго. Решил им сделать подарок.
Постараемся написать приложение которое считывало бы текст из всех текстовых документов в выбраной пользователем директории и записывало бы в один…но большой.
Статья разбита на две части. В первой будет рассказанно о выборе директории и считывании из неё списка файлов и вместе с тем их текстовое содержание. Во второй части будет расмотрено сохранение файлов из AIR и запись в них информации.
Для начала не плохо было бы ознакомиться с пакетом
flash.filesystem, всё что нам понадобится для написания этого приложения находится там.
Что нам нужно написать:
1. Синглтон в котором будет храниться информация которая понадобится нам в других классах.
2. компонент который при нажатии будет вызывать окно ОС для выбора папки и записывать путь до неё в синглтон. Затем анализировать содержимое папки и записывать список файлов с нужным расширением (в нашем случае .txt) в виде массива в тот же синглтон. После выполнения будет диспечить событие.
3. компонент считывающий список файлов и форматирующий имена в одну строку. Понадобится для вывода списка файлов в текстовой блок.
После выполнения будет диспечить событие.
4. компонент считывающий имена и содержание текстовых файлов, форматирующий текст из них и записывающий полученую строку в синглтон. После выполнения будет диспечить событие.
5. компонент вызывающий окно ОС для сохранения файла и записывающий текст из всех текстовых файлов в один .doc файл.
Визуально это будет выглядеть так:
Как вы уже успели заметить в списке задач часто употребляется выражение «После выполнения будет диспечить событие», пишу отнюдь не из-за того что урок маленьким получается, а просто нам предстоит написать ещё код для главного mxml файла, который на каждое событие будет графически оформлять результат события.
От слов к делу.
Создаём наше AIR приложение во флексе. (как это сделать можно прочесть в другой статье). // может быть
Так как это не статья по программированию на AS3 полный код я писать тут не буду, только то что затрагивает AIR. Полный код вы можете найти в архиве который прилагается к уроку. Советую его скачать прямо сейчас.
В синглтоне нам нужно будет указать сеттеры и геттеры.
Сеттеры:
Path – путь до папки (String)
nams – массив с именами файлов (Array)
string – строка с форматированым содержанием файлов (String)
Не буду повторяться, геттеры те же что и сеттеры с типами что в скобках.
После того как вы написали его или воспользовались мною написанным, сохраняем его в AS файл в
root директорию нашего проекта под названием «InfoCollector».
Дальше нам нужно написать компонент который описан во втором пункте. Сам он будет представлять стандартную кнопку по нажатию на которой будет срабатывать код в тэгах
. Создаём, обзываем «Browse» и сохраняем его в папке comps (там будут храниться все наши компоненты).
За работу с дирекориями отвечает пакет flash.filesystem, в частности класс File.
С помощью этого класса можно создавать, перемещать, удалять, копировать…в общем манипулировать с объектами.
browseForDirectory – тот самый метод который нам нужен для вызова окна. Он принимает только один парамметр — строку, она будет высвечена в открытом окне.
У класса File имеются схожие методы:
browseForOpen – существует для выбора файла, а не директории. Принимает два параметра, имя и фильтр файлов.
browseForOpenMultiple – тоже самое что и browseForOpen только можно выбрать больше одного файла.
У этого класса есть ещё ряд событий, часть из них унаследована от FileReference.
Нас интересуют события которые генеряться после вызова метода browseForOpen.
select - при выборе
cancel – при отказе
Пишем основной код для него:
Browse.mxml
Код:
[обрезано]
private var directory:File; //
private function clickHandler (e:Event):void {
directory = new File ();
//вызываем стандартное окно ОС для выбора папки
directory.browseForDirectory("Select Directory");
//после выбора диспетчим
directory.addEventListener(Event.SELECT, directorySelected);
}
private function directorySelected (e:Event):void {
//выбраная папка
directory = e.target as File;
var files:Array = directory.getDirectoryListing() //возвращает массив с именами файлов
var files_ar:Array = new Array ();
//проверяем расширение файла, если .txt то записываем в новый массив
for (var i:uint; i < files.length; i++){
var file_format:String = String (files[i].name).substr (-3);
if (file_format == 'txt') {
files_ar.push (files[i].name);
}
}
//записываем путь до папки и массив с именами в InfoCollector
IC.path = directory.nativePath;
IC.nams = files_ar;
dispatchEvent (new Event (RESOLVED));
}
[обрезано]
Как выбирать директории и даже как считывать из них список файлов теперь мы знаем. Осталось научиться считывать их содержимое и записывать его в один файл.