2016-08-06 7 views
0

Я пытаюсь написать код, который может скопировать файл jpg из одного каталога в другой. Я имею в виду, чтобы загрузить выбранный jpg в байты, а затем записать его через writebytes в назначенную папку. Это настольное приложение AIR.Adobe Air FileStream копирует jpg из одной директории в другую

private function update_treebg(event:MouseEvent):void { 
     saveDir = 'structure/' + id + '/bg.jpg'; 
     file.addEventListener(Event.SELECT, onFileSelected); 
     file.browseForOpen("Select an image", [imgFilter]); 
    } 

    private function onFileSelected(event:Event):void { 
     file.removeEventListener(Event.SELECT, onFileSelected); 
     fs.open(event.target as File, FileMode.READ); 
     fs.readBytes(bytes); 
     fs.close(); 

     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onFileLoaded); 
     loader.loadBytes(bytes); 
    } 

    private function onFileLoaded(event:Event):void { 
     event.target.removeEventListener(Event.COMPLETE, onFileLoaded); 

     var targetFile:File = File.desktopDirectory.resolvePath(saveDir); 
     fs.open(targetFile, FileMode.WRITE); 
     fs.writeBytes(event.target.bytes, 0, event.target.bytes.length); 
     fs.close(); 
    } 

Каждый раз, когда я пишу файл, поврежденный файл jpg появляется в указанном каталоге. Я что-то пропустил? Если вы знаете, как лучше это сделать, дайте мне знать!

ответ

0

Вы можете сделать это так, как вы показали, но есть гораздо более простой способ скопировать файл с использованием классов файлов copyTo. Вот пример для контекста:

private function onFileSelected(event:Event):void { 
    var sourceFile:File = event.target as File; 
    var targetFile:File = File.desktopDirectory.resolvePath(saveDir); 

    sourceFile.copyTo(targetFile, true); //true is for overwrite if already exists 
} 

Использование копирования и делает это так, вам не придется загружать содержимое/байт файла в памяти, который будет делать это намного быстрее.

Если вам не нужно ждать завершения копирования (или если файл большой), вы должны использовать вместо этого copyToAsync, чтобы ваша программа не была заблокирована во время завершения операции копирования.

+0

Это то, к чему я стремился. Благодарю. – user1234567

-1

я могу быть идиотом иногда ...

private function update_treebg(event:MouseEvent):void { 
     saveDir = 'structure/' + id + '/bg.jpg'; 
     file.addEventListener(Event.SELECT, onFileSelected); 
     file.browseForOpen("Select an image", [imgFilter]); 
    } 

    private function onFileSelected(event:Event):void { 
     file.removeEventListener(Event.SELECT, onFileSelected); 
     fs.open(event.target as File, FileMode.READ); 
     fs.readBytes(bytes); 
     var targetFile:File = File.desktopDirectory.resolvePath(saveDir); 
     fs.open(targetFile, FileMode.WRITE); 
     fs.writeBytes(bytes, 0, bytes.length); 
     fs.close(); 
    } 

Я получил это исправлено.

+0

Ваш ответ ничего не объясняет и как таковой ограничен для будущих посетителей. Пожалуйста, уделите несколько минут, чтобы описать свое исправление, а не просто вставить код. – BadFeelingAboutThis