Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > alexcon314

Оценить эту запись

AIR: Чтение из .txt и запись в .doc

Запись от alexcon314 размещена 19.04.2011 в 08:03

Автор: screamge

Работа с файлами и директориями.
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».

Дальше нам нужно написать компонент который описан во втором пункте. Сам он будет представлять стандартную кнопку по нажатию на которой будет срабатывать код в тэгах <mx:Script>. Создаём, обзываем «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));
}
[обрезано]

Как выбирать директории и даже как считывать из них список файлов теперь мы знаем. Осталось научиться считывать их содержимое и записывать его в один файл.
Чтение и запись.
Рассмотрим код в файле 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 приложение, исходники урока и папка с текстовыми файлами.
[из реорганизованного раздела Flash Приложения: AIR, Zinc и тд.]
Вложения
Тип файла: rar TXTReader.rar (649.6 Кб, 145 просмотров)
Тип файла: rar src.rar (22.0 Кб, 135 просмотров)
Тип файла: rar txt_source.rar (505 байт, 129 просмотров)
Всего комментариев 0

Комментарии

 

 


Часовой пояс GMT +4, время: 20:06.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.