|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Ветеран форума
Регистрация: Jul 2006
Адрес: Грузия, Тбилиси
Сообщений: 2,675
|
Урок: Чтение из .txt и запись в .doc
Работа с файлами и директориями.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». Дальше нам нужно написать компонент который описан во втором пункте. Сам он будет представлять стандартную кнопку по нажатию на которой будет срабатывать код в тэгах За работу с дирекориями отвечает пакет 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)); } [обрезано] Как выбирать директории и даже как считывать из них список файлов теперь мы знаем. Осталось научиться считывать их содержимое и записывать его в один файл. Последний раз редактировалось Nirth; 28.10.2007 в 11:10. |
|
|||||
Ветеран форума
Регистрация: Jul 2006
Адрес: Грузия, Тбилиси
Сообщений: 2,675
|
Урок: Чтение из .txt и запись в .doc (часть 2)
Чтение и запись.Рассмотрим код в файле ReadFiles.mxml. Что мы имеем? import flash.events.*; private var file:File; private var stream:FileStream; private var IC:InfoCollector; private var result_str:String = ''; private function init (e:Event):void { IC = InfoCollector.getInstance (); stream = new FileStream (); } private function read (e:Event):void { file = File.documentsDirectory; var path:String = IC.path; //проходим по всем именам в массиве for (var i:uint = 0; i < IC.nams.length; i++){ //полный путь до файла file = file.resolvePath(path + '/' + IC.nams[i]); //открываем файл stream.open(file, FileMode.READ);//FileMode.READ укаазывает на тип открытия /* приводим строку к виду //* название файла.txt //содержание файла, если пустой пишем " -- empty -- " //дописываем прочерк и отступ строки на два пункта result_str += '* ' + IC.nams[i] + '\n'; */ var text_in:String = stream.readMultiByte (stream.bytesAvailable, "iso-8859-01"); if (text_in == ''){ result_str += '-- empty --'; } else { result_str += text_in; } result_str += '\n_____________________ \n\n'; stream.close(); } } FileStream – класс пакета flash.filesystem, он нам и понадобится для побайтового чтения содержания файлов. FileMode – класс того же пакета что и предыдущие два класса. Его существование обоснованно безопасностью файла который открыт, но об этом коротко буквально через несколько строчек. При помощи FileStream мы можем считывать и записывать файлы. То что любой файл состоит из битов которые состовляют байты я рассказывать не буду, так вот о чём это я, о том что мы можем модифицировать любой файл внезависимости от его расширения. Для этого существует ряд методов с которыми вы можете ознакомиться в документации. В уроке используются два, readMultiByte и writeMultiByte. readMultiByte — принимает два параметра, длину и кодировку в которой будет прочтён файл. AIR поддерживает не много кодировок. Если выбраная кодировка будет отсутствовать в системе под которой работает AIR этот парамметр будет заменён на другой возможный. FileMode — тип того что будет сделано. Констант всего 4. READ – исключительно чтение WRITE – запись и создание если не существует APPEND – Запись, создание и добавление. UPDATE – Чтение, запись и создание. Если не хотите чтобы с файлом во время выполнения что-то произошло выставляйте FileMode в READ. Теперь мы имеем отформатированое содержимое файлов, осталось его записать в файл. Для этого нам нужно будет вызвать browseForSave нами бегло рассмотренного класса File. После того как пользователь выберет директорию и запишет имя файла мы вызовем код создающий файл и записывающий в него нашу текстовую информацию. К сожалению метод browseForSave урезан в своей функциональности, мы не можем назначать дефолтное имя фаила, т.е. пользователю придёться вводить его самостоятельно. Ещё мы не можем выбирать разрешение в котором сохранять файл, нет фильтра как browseForOpen. Ну что же будем сохранять файл для ворда, с форматом .doc. Пишем код: WriteFile.mxml private var myFile:File myFile = File.desktopDirectory; private function browseFolder (e:Event):void { try{ myFile.browseForSave ("open file..."); } catch(e:Error){ } myFile.addEventListener(Event.SELECT, saveData); } private function saveData (e:Event):void { trace (e.target.nativePath); var newFile:File = File.documentsDirectory.resolvePath(e.target.nativePath + '.doc'); if (!newFile.exists){ var stream:FileStream = new FileStream(); stream.open(newFile, FileMode.WRITE); stream.writeMultiByte (IC.string, "UTF-8"); stream.close(); } } } Если файла не существует файл будет создан, а если да то будет перезаписан. Снова пользуемся FileStream но теперь для записи. Код схож с тем который писали для открытия директории, тот же слушатель который реагирует на выбор директории. Вроде всё, всем удачи. К уроку прилагаются: AIR приложение, исходники урока и папку с текстовыми файлами . Последний раз редактировалось screamge; 22.04.2008 в 05:58. |
Часовой пояс GMT +4, время: 11:00. |
|
« Предыдущая тема | Следующая тема » |
|
|