package net.gerhut
{
    import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.net.FileReference;
	import flash.net.URLRequest;
	import flash.net.URLStream;
	
	[Event(name="complete")]
	[Event(name="ioError", type="flash.events.IOErrorEvent")]
	public class Downloader extends EventDispatcher
	{
		private const TEMP_EXT:String = ".downloading"; 
		
		public var url:String;
		public var file:String;
		
		[Bindable]
		public var percent:uint;
		
		private var urlStream:URLStream;
		private var fileStream:FileStream = null;
		
		public function Downloader(url:String, file:String)
		{
			this.url = url;
			this.file = file;
			urlStream = new URLStream();
			urlStream.addEventListener(Event.OPEN, openHandler);
			urlStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
			urlStream.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
			urlStream.addEventListener(Event.COMPLETE, completeHandler);
			fileStream = new FileStream();
			fileStream.addEventListener(Event.CLOSE,closeHandler);
		}
		
		public function start():void
		{
			var f:File = new File(file); 
			if(f.exists)
			{
				percent = 100;
				trace(file + " already downloaded.");
				dispatchEvent(new Event(Event.COMPLETE));
				return;
			}
			
			urlStream.load(new URLRequest(url));
		}
		public function openHandler(event:Event):void
		{
			fileStream.openAsync(new File(file + TEMP_EXT), FileMode.UPDATE);
			urlStream.removeEventListener(Event.OPEN, openHandler);
		}
		
		private function progressHandler(event:ProgressEvent):void
		{
			while(urlStream.bytesAvailable)
				fileStream.writeByte(urlStream.readByte());
			percent = 100 * event.bytesLoaded / event.bytesTotal;
		}
		
		private function ioErrorHandler(event:IOErrorEvent):void
		{
			dispatchEvent(new IOErrorEvent(IOErrorEvent.IO_ERROR));
		}
		
		private function completeHandler(event:Event):void
		{
			percent = 100;
			fileStream.close();
			urlStream.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
			urlStream.removeEventListener(Event.COMPLETE, completeHandler);
			urlStream.close();
			urlStream = null;
		}
		
		private function closeHandler(event:Event):void
		{
			new File(file + TEMP_EXT).moveTo(new File(file), true);
			trace(file + " downloaded.");
			fileStream.removeEventListener(Event.CLOSE,closeHandler);
			fileStream = null;
			dispatchEvent(new Event(Event.COMPLETE));
		}
	}
}

用法:

var downloader:Downloader = new Downloader("http://gerhut.net/", "C:\\index.html");
downloader.addEventListener(Event.COMPLETE, completeHandler);
downloader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
downloader.start();