Приложение Adobe Air закрывается при выборе большого количества файлов

#actionscript-3 #actionscript #air

#actionscript-3 #actionscript #air

Вопрос:

В моем приложении, когда я загружаю много файлов (более 100 ~), приложение автоматически закрывается.

Я использую FileListEvent.SELECT_MULTIPLE, это приложение предназначено только для получения имен файлов.

 function selectFile(e: MouseEvent): void {

    file_selected.browseForOpenMultiple("Selecionar fotos:", [jpgFilter]); 
    file_selected.addEventListener(FileListEvent.SELECT_MULTIPLE, onFileSelected); 
}

function clearTextArea(e:MouseEvent):void {
    textArea.text = "";
    txt_folder.text = "";
}

function onFileSelected(e: FileListEvent): void {
    trace("test");
    for (var i:uint = 0; i < e.files.length; i  ) 
    {
        //trace("NOME: "   e.files[i].name);
        obj_list.push({file_name:e.files[i].name});
    }

    fileInformation(obj_list[email_number].file_name);
}


function fileInformation($name:String):void {

    var domain_name:String = "";
    var file_name:String = $name;
    var nome:String;
    var email:String;

    if(file_name.indexOf(divisor) != -1){
        nome = file_name.slice(0, file_name.indexOf(divisor) - 1);
        email = file_name.slice(file_name.indexOf(divisor)   2, file_name.length).toUpperCase();
    }

    if(email.indexOf("(") != -1){
        email = email.slice(0, email.indexOf("(") - 1);
    }

    trace("Nome: "   nome);
    trace("Email: "   email);

    textArea.appendText(String("n"   email).toUpperCase());

    email_number  ;
    if(email_number <= obj_list.length - 1){
        fileInformation(obj_list[email_number].file_name);
    }

}
  

Существует ограничение на загрузку нескольких файлов?

Комментарии:

1. Вы получаете какие-либо сообщения об ошибках?

2. Это может быть ограничение операционной системы.

3. Сообщения об ошибке отсутствуют. Закройте только приложение. Я думаю, что это тоже ограничение операционной системы. Возможно, ошибка памяти.

Ответ №1:

Если выбор нескольких файлов приводит к сбою приложения, я могу придумать только несколько обходных путей…

Вариант 1) Почему бы не изменить логику? Попробуйте как:

  • Пользователь просматривает / выбирает один jpeg из требуемой папки.
  • Затем ваше приложение автоматически сканирует ту же папку, чтобы получить имена всех файлов с текстом, .jpg содержащим в каждом файле свой собственный file.name или file.url текст.

Вариант 2) Используйте внешнюю программу для получения списка имен файлов. Если вы используете Windows, вы можете использовать командную строку (например: cmd.exe с ее dir опцией). Что-то вроде…

Используйте cmd.exe /K "cd /d e:myImagesFolder" для запуска командной строки с E: диска myImagesFolder .
Затем используйте dir *.jpg для получения списка всех файлов jpeg в папке.

Возможно, получение выходных данных командной строки в вашем приложении AIR может быть решением проблемы сбоя?

Приведенный ниже код непроверен, но вам нужна эта логика для вывода в командной строке:
(окно терминала не появится, это тихий / невидимый запуск, но вы можете увидеть cmd.exe список в диспетчере задач) :

 var file_selected :File = File.documentsDirectory;
var user_Folder_Path : String = ""; //# update with User folder path (after they selected 1 file)
var str_Temp : String = "";
var str_Files : String = "";

var processInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
var processArgs:Vector.<String> = new Vector.<String>();
var process:NativeProcess = new NativeProcess();

function selectFile (e :MouseEvent) :void 
{ 
    file_selected.browseForOpen("Selecionar fotos:", [jpgFilter]);  
    file_selected.addEventListener(Event.SELECT, fileSelected); 
} 

function fileSelected(event:Event):void 
{ 
    str_Temp = fileToOpen.nativePath;

    //# trim down to folder path eg: remove file name part
    user_Folder_Path = str_Temp.substring(0, str_Temp.lastIndexOf("") );

    str_Temp = str_Files = ""; //reset both strings

    if(NativeProcess.isSupported)
    {
        processInfo.executable = new File("C:/Windows/System32/cmd.exe");
        processArgs.push("dir *.jpg"   " "   user_Folder_Path );
        processInfo.arguments = processArgs;

        process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, std_onStandardOutputData);  
        process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, std_onError);

        process.start(processInfo);
        process.standardInput.writeUTFBytes(processArgs   "n"); 
    }
}

function std_onStandardOutputData(evt:ProgressEvent):void  
{  
    var process:NativeProcess = evt.target as NativeProcess;  
    var data:String = process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable);  
    str_Files  = data; //holds file names as they come in from CMD.exe
}   

function std_onError(evt:ProgressEvent):void 
{                    
    var process:NativeProcess = evt.target as NativeProcess;  
    var data:String = process.standardError.readUTFBytes(process.standardError.bytesAvailable);  
    str_Temp  = data; //holds other text data from CMD...                     
}