2010-12-14 30 views
1

使用Flash Builder 4使用Flex 4.1。 我有一个空气应用程序,用于下载数组中指定的文件。 我正试图在文件写入磁盘后更改状态。等到阵列功能完成到:

功能finalscreen的文件下载完成之前被调用。这对于我放大来测试它的大视频文件来说很明显。

<fx:Script> 
    <![CDATA[ 
     function finalscreen() 
     { 
      this.currentState="Finished"; 
     }  
     private function initiate_download(event:MouseEvent):void 
     { 
      this.currentState="Working"; 
      var filearray:Array = new Array(); 
      filearray[0]="0.jpg"; 
      filearray[1]="1.jpg"; 
      filearray[2]="2.jpg"; 
      filearray[3]="3.jpg"; 
      filearray[4]="4.jpg"; 
      filearray[5]="5.jpg"; 
      filearray[6]="6.jpg"; 
      filearray[7]="7.jpg"; 
      filearray[8]="8.jpg"; 
      filearray[9]="9.jpg"; 
      filearray[10]="10.jpg"; 
      filearray[11]="1.avi"; 
      for (var i:uint; i < filearray.length; i++) { 
       var remoteURL = "http://domain/dir/" + filearray[i]; 
       var localURL = "C:/dir/" + filearray[i]; 
       downloadFile(remoteURL, localURL); 
      } 
    finalscreen(); 

      function downloadFile(url, filename) 
      { 
       // Create the stream for the data request 
       var urlStream = new URLStream(); 

       // Used to initiate request for remote file 
       var request = new URLRequest(url); 

       // Create file stream 
       var fileStream = new FileStream(); 

       // Create a reference to a location on disk 
       var file = File.desktopDirectory.resolvePath(filename); 

       // Called as download progresses 
       var writeFile = function() 
       { 
        // Write to file 
        if (urlStream.bytesAvailable > 51200) 
        { 
         var dataBuffer = new ByteArray(); 
         urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable); 
         fileStream.writeBytes(dataBuffer, 0, dataBuffer.length); 
        } 
        return true; 
       } 

       // Called when download completes 
       var finishWriteFile = function() 
       { 
        // Write to file 
        if(urlStream.bytesAvailable > 0) 
        { 
         var dataBuffer = new ByteArray(); 
         urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable); 
         fileStream.writeBytes(dataBuffer, 0, dataBuffer.length); 
        } 

        // Close streams 
        fileStream.close(); 
        urlStream.close(); 
        return true; 
       } 

       // Initiate download 
       fileStream.open(file, FileMode.WRITE); 
       urlStream.load(request); 

       // Add event listeners 
       urlStream.addEventListener(Event.COMPLETE, finishWriteFile); 
       urlStream.addEventListener(ProgressEvent.PROGRESS, writeFile); 
      } 
    } 
    ]]> 
</fx:Script> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<s:states> 
    <s:State name="Start"/> 
    <s:State name="Working"/> 
    <s:State name="Finished"/> 
</s:states> 

谢谢!

+0

好吧,我一直在用这个搞乱并且限制阵列循环进行到第11,离开最后一个称之为“复制”功能最后状态发生变化,但由于异步写入,它不能正常工作。我将openSync中的fileStream改为刚刚打开,并尝试使文件顺序下载,但这会减慢速度。 – mubhcaeb 2010-12-15 17:24:48

+0

几乎得到它! 改为开放模式来更新,以便它可以返回close事件。 fileStream.openAsync(file,FileMode.UPDATE); 现在我的eventlistener可以开火了! fileStream.addEventListener(Event.CLOSE,??????); 和它的作品,如果我将它设置为finalScreen上最大的文件。我现在需要在文件关闭之后完成它,它将进入阵列中的下一个。 – mubhcaeb 2010-12-17 17:42:46

回答

0

好吧,我没有找到一个方法的功能在阵列中被执行之间“暂停”。

相反,我想过使用文件的计数器,所以这并不重要,他们被装什么样的顺序,只要所有11加载的,然后加载的最终状态。

这里是我的代码为别人引用:

<fx:Script> 
    <![CDATA[ 
     private function close_window(event:MouseEvent):void 
     { 
      this.nativeApplication.exit(); 
     } 
     private function finalScreen():void 
     { 
      this.currentState="Finished"; 
     } 
     private function initiate_download(event:MouseEvent) 
     { 
      var filearray:Array = new Array(); 
      filearray[0]="0.jpg"; 
      filearray[1]="1.exe"; 
      filearray[2]="02.jpg"; 
      filearray[3]="2.exe"; 
      filearray[4]="04.jpg"; 
      filearray[5]="05.jpg"; 
      filearray[6]="4.exe"; 
      filearray[7]="07.jpg"; 
      filearray[8]="08.jpg"; 
      filearray[9]="09.jpg"; 
      filearray[10]="3.exe"; 
      for(var i:uint; i < filearray.length; i++) 
      { 
       var remoteURL = "http://domain/dir/" + filearray[i]; 
       var localURL = "C:/dir/" + filearray[i]; 
       downloadFile(remoteURL, localURL); 
      } 

      var filenumber = 0; 

      function downloadFile(url, filename) 
      { 
       // Create the stream for the data request 
       var urlStream = new URLStream(); 

       // Used to initiate request for remote file 
       var request = new URLRequest(url); 

       // Create file stream 
       var fileStream = new FileStream(); 

       // Create a reference to a location on disk 
       var file = File.desktopDirectory.resolvePath(filename); 

       // Called as download progresses 
       var writeFile = function() 
       { 
        // Write to file 
        if (urlStream.bytesAvailable > 51200) 
        { 
         var dataBuffer = new ByteArray(); 
         urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable); 
         fileStream.writeBytes(dataBuffer, 0, dataBuffer.length); 
        } 
        return true; 
       } 

       // Called when download completes 
       var finishWriteFile = function() 
       { 
        // Write to file 
        if(urlStream.bytesAvailable > 0) 
        { 
         var dataBuffer = new ByteArray(); 
         urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable); 
         fileStream.writeBytes(dataBuffer, 0, dataBuffer.length); 
        } 

        // Close streams 
        fileStream.close(); 
        urlStream.close(); 
        return true; 
       } 

       // Initiate download 
       fileStream.openAsync(file, FileMode.UPDATE); 
       urlStream.load(request); 

       // Add event listeners 
       urlStream.addEventListener(Event.COMPLETE, finishWriteFile); 
       urlStream.addEventListener(ProgressEvent.PROGRESS, writeFile); 
       fileStream.addEventListener(Event.CLOSE, updateProgress); 

       function updateProgress(event:Event):void 
       { 
        filenumber = filenumber+1; 
        progbar.setProgress(filenumber*10, 110); 
        if(10*filenumber == 110) 
        { 
         finalScreen(); 
        } 
       } 
      } 

     } 
    ]]> 
</fx:Script> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<s:states> 
    <s:State name="Start"/> 
    <s:State name="Working"/> 
    <s:State name="Finished"/> 
</s:states> 

<mx:Image x="0" y="0" source="background.jpg"/> 
<s:Button x="50" y="110" includeIn="Start" label="Update" id="download" click="currentState='Working'; initiate_download(event)" color="#FFFFFF" fontSize="30" width="300" height="40"/> 
<s:Button x="50" y="110" includeIn="Finished" label="Close Window" id="closer" click="close_window(event)" color="#FFFFFF" fontSize="30" width="300" height="40"/>  
<s:RichText includeIn="Start" x="-22" y="85" text="Press Update to begin." width="444" textAlign="center" fontSize="14" id="starttext" color="#FFFFFF"/> 
<s:RichText includeIn="Working" x="-22" y="85" text="Downloading and updating files...." width="444" textAlign="center" fontSize="14" id="workingtext" color="#848484"/> 
<s:RichText includeIn="Finished" x="109" y="85" text="Update completed." width="191" textAlign="center" fontSize="14" id="finishedtext" color="#49D30C"/> 
<mx:ProgressBar includeIn="Working" id="progbar" mode="manual" x="121" y="107" fontSize="18" textAlign="center"/>