Буду выкладывать наработки в народ
Поиск файлов в системе.[AIR]
Появилась задача :
Найти все фотографии пользователя на мобильнике
Решение :
var fileFinder:FileSearcher = new FileSearcher(File.documentsDirectory , ["jpeg","jpg","png"]); fileFinder.find(); var images:Vector.<File> = fileFinder.result;
Возможности :
Синхронный и асинхронный поиск
Пока все сыро, приму любые комментарии
Исходный код :
FileSearcher.as
package ru.air.gmobile.files { import flash.events.Event; import flash.events.EventDispatcher; import flash.events.FileListEvent; import flash.filesystem.File; /** * FileSearcher is class to search files in directory and its sub-direcrories; * @author Dmitry Petrov * @download http://www.genzo-dev.ru/as3/FileSearcher.rar * @langversion 3.0 * @playerversion AIR 1.0 * @version 1.0a **/ public class FileSearcher extends EventDispatcher { public static const MODE_SYNC:String = "modeSync"; public static const MODE_ASYNC:String = "modeAsync"; private var foundedFiles:Vector.<File> = new Vector.<File>; private var proceedDirs:Array = new Array(); private var proceedFiles:Array = new Array(); private var _rootDir:File; private var _extensions:Object; private var _mode:String; private var _searchHidden:Boolean; private var _found:Boolean; /** * * @param rootDir:File Root Directory * @param fileTypes:Array Array of file types (File.extension), eg : ["jpg","jpeg","png"] * @param mode:String Serach mode : FileSearcher.MODE_SYNC || FileSearcher.MODE_ASYNC * @param searchHidden:Boolean Look for hidden files or skip them * */ public function FileSearcher(rootDir:File , fileTypes:Array , mode:String = MODE_SYNC , searchHidden:Boolean = false) { this._extensions = new Object(); for each(var i:String in fileTypes) { this._extensions[i] = true; } this._mode = mode; this._searchHidden = searchHidden; this._rootDir = rootDir; } /** * Start searching , don't forget to add listener for FileSearcherEvent.COMPLETE (and optional FileSearcherEvent.PROGRESS) if mode == ASYNC * @throws ArgumentError - unknow mode */ public function find():void { listing(this._rootDir); } private var searching:Boolean = false; protected function proceed():void { if(searching == true) return; searching = true; while(searching != false) { var file:File = this.proceedFiles.pop(); if(file == null) {searching = false;continue;} if(file.isHidden && this._searchHidden === false || file.isSymbolicLink) continue; if(file.isDirectory) { proceedDirs.push(file); listing(file); }else if(file.extension != null && this._extensions.hasOwnProperty(file.extension)){ found(file); } } if(proceedDirs.length == 0) this.finish(); } protected function found(file:File):void { switch(this._mode) { case MODE_SYNC: foundedFiles.push(file); break; case MODE_ASYNC: foundedFiles.push(file); this.dispatchEvent(new FileSearcherEvent(FileSearcherEvent.PROGRESS , file)); break; } } protected function listing(dir:File):void { switch(this._mode) { case MODE_SYNC: listingComplete(dir.getDirectoryListing()); break; case MODE_ASYNC: dir.addEventListener(FileListEvent.DIRECTORY_LISTING , listingEventComplete); dir.getDirectoryListingAsync(); break; default: throw new ArgumentError("Unknown search mode '" + this._mode + "'"); break; } } protected function listingEventComplete(e:FileListEvent):void { e.currentTarget.removeEventListener(FileListEvent.DIRECTORY_LISTING , listingEventComplete); this.proceedFiles = this.proceedFiles.concat(e.files); proceedDirs.pop(); proceed(); } protected function listingComplete(list:Array):void { this.proceedFiles = this.proceedFiles.concat(list); proceedDirs.pop(); proceed(); } private function finish():void { this._found = true; this.dispatchEvent(new FileSearcherEvent(FileSearcherEvent.COMPLETE)); } /** * Return's founded files * @return Vector.<File> - Founded files */ public function get result():Vector.<File> { if(this._found) { return this.foundedFiles; }else{ return null; } } } }
package ru.air.gmobile.files { import flash.events.Event; import flash.filesystem.File; public class FileSearcherEvent extends Event { private var _file:File; private var _type:String; public static const COMPLETE:String = "complete"; public static const PROGRESS:String = "progress"; public function FileSearcherEvent(type:String, file:File = null ,bubbles:Boolean=false, cancelable:Boolean=false) { this._type = type; if(this._type === PROGRESS){ this._file = file; } super(type, bubbles, cancelable); } public function get file():File { if(this._type === PROGRESS){ return _file; }else{ throw new ArgumentError("Can't get file in non - PROGRESS event"); } } } }
Всего комментариев 14
Комментарии
23.12.2011 16:30 | |
Для начала надо название темы сменить, а то "Поиск файлов AIR" говорит о том, что речь пойдет о поиске файлов *.air
|
23.12.2011 18:17 | |
FileSearcher is a class for
По коду, наличие protected методов в пользу private имеет смысловую нагрузку в вашем коде? |
23.12.2011 18:47 | |
Вообще поспешил я в народ выкладывать, написал то за 30 минут и 10 минут ASDoc'и писал =) Жду дальнейших комментариев, нужно само-совершенствоваться.
|
23.12.2011 21:12 | |
24.12.2011 01:06 | |
А чем при поиске фотографий не устраивает CameraRoll?
|
24.12.2011 23:57 | |
Можно ли в статье в двух словах указать каким способом решается поставленная задача? Код обычно служит для иллюстрации работы заявленного алгоритма.
|
26.12.2011 19:08 | |
Цитата:
А зачем искать папки?
|
26.12.2011 19:11 | |
Цитата:
Не папки искать, а в скрытых папках.
|
26.12.2011 23:19 | |
а нуда
|
Последние записи от Genzo
- Поиск файлов в системе.[AIR] (23.12.2011)
- Соревнование на быстроту алгоритмов (20.10.2011)
- Хранение Graphics (05.08.2011)