Adobe Air FileStream 将 jpg 从一个目录复制到另一个目录

Adobe Air FileStream copy jpg from one directory to another

我正在尝试编写可以将 jpg 文件从一个目录复制到另一个目录的代码。我的想法是将选定的 jpg 加载到字节中,然后通过 writebytes 将其写入指定的文件夹。这是一个桌面 AIR 应用程序。

    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文件。我错过了什么?如果您知道更好的方法,也请告诉我!

有时候我也是个白痴...

    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();
    }

我修好了。

您可以按照您展示的方式执行此操作,但使用文件 类 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
}

使用复制也可以使您不必先将文件的 contents/bytes 加载到内存中,这样速度会快得多。

如果您不需要等待复制完成(或者如果文件很大),您应该使用 copyToAsync,这样您的程序就不会在复制操作完成时被锁定.