清单大量的文件和目录包含在Adobe AIR子目录 [英] Listing huge amount files and directories include subdirectories in Adobe AIR

查看:140
本文介绍了清单大量的文件和目录包含在Adobe AIR子目录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想列出文件和目录,复制现有的任何其他文件夹中的所有文件。

顺便说一句,有很多的文件和目录超过1000 + 000

下面是code的一部分。

 私有函数getFileList(sourceDir:字符串):无效{
    var文件:文件= File.userDirectory.resolvePath(sourceDir);
    file.addEventListener(FileListEvent.DIRECTORY_LISTING,directory_listing);
    file.getDirectoryListingAsync();
}
私有函数directory_listing(E:是FileListEvent):无效{
    VAR的GetFiles:阵列= e.files;

    每个(VAR项目:文件中e.files){

        如果(checkDir(item.nativePath)){
            //这是一个目录,更多的逻辑!
            totalDirNum ++;
            item.addEventListener(FileListEvent.DIRECTORY_LISTING,directory_listing);
            item.getDirectoryListingAsync();
        }
        其他{
        //这是一个文件,更逻辑!
            totalFileNum ++;
                如果(analyzeFile(项目)===真){
                如果(overwriteChk.selected ===假){//不覆盖相同的文件
                            如果(checkFile(destinationDir.nativePath +\\+ item.name)===假){
                            copyInto(项目,destinationDir.resolvePath(destinationDir.nativePath +\\+ item.name));
                            copiedNum ++;
                        }
                        其他uncopiedNum ++;
                    }
                    其他{//覆盖同名文件
                        copyInto(项目,destinationDir.resolvePath(destinationDir.nativePath +\\+ item.name));
                        copiedNum ++;
                    }

                }
                其他{
                    skippedNum ++;
                    }
            }
    }
 

正如你看到的,它执行递归directory_listing()。

在案件的小文件和目录,它的工作原理清楚了。

但是,例如,在下面的情况下,它不工作的明确(出现没有响应。)

根目录:A

一个包含500 000多个子目录。

每个子目录包括4个或5个文件和一个或两个子目录

和还subdirectoy包括4个或5个文件。

所以,我需要的A文件夹中的所有文件复制到特定文件夹(B!)。

计划是循环之前停止在第一位。即命名为A文件夹,包括巨大的子文件夹,所以当程序运行到选择一个A的文件夹,然后将其停止只是A文件夹列表(停在getDirectoryListingAsyc())。所以,其实它不叫递归。

下面是我的完整源$ C ​​$ C。

 < XML版本=1.0编码=UTF-8&GT?;
< S:的WindowedApplication的xmlns:FX =htt​​p://ns.adobe.com/mxml/2009
                       XMLNS:S =库://ns.adobe.com/flex/spark
                       的xmlns:MX =库://ns.adobe.com/flex/mx
                       宽度=800的高度=600
                       标题=eveningCopier  - 鸟集纳
                       的creationComplete =initApp()>
    < FX:脚本>
        <![CDATA [
            进口mx.controls.Alert;

            公共变种sourceDir:文件;
            公共变种destinationDir:文件;

            公共变种totalDirNum:单元;
            公共变种totalFileNum:单元;
            公共变种copiedNum:单元;
            公共变种skippedNum:单元;
            公共变种uncopiedNum:单元;

            公共变种的startTime:字符串;
            公共变种finishTime:字符串;

            / **
             *开机功能
             ** /
            公共职能initApp():无效{
                sourceBtn.addEventListener(MouseEvent.CLICK,click_sourceBtn);
                destinationBtn.addEventListener(MouseEvent.CLICK,click_destinationBtn);
                startBtn.addEventListener(MouseEvent.CLICK,click_startBtn);

                totalDirNum = 0;
                totalFileNum = 0;
                copiedNum = 0;
                skippedNum = 0;
                uncopiedNum = 0;
            }

            / **
             *事件监听器,当点击源按钮
             ** /
            保护功能click_sourceBtn(E:的MouseEvent):无效{
                sourceDir =新的文件();
                sourceDir.addEventListener(Event.SELECT,select_source);
                sourceDir.browseForDirectory(请选择一个源代码目录...);
            }
            私有函数select_source(EVT:事件):无效{
                sourceTxt.text = sourceDir.nativePath;
            }

            / **
             *事件监听器,当点击目的地按钮
             ** /
            保护功能click_destinationBtn(E:的MouseEvent):无效{
                destinationDir =新的文件();
                destinationDir.addEventListener(Event.SELECT,destination_select);
                destinationDir.browseForDirectory(请选择一个源代码目录...);
            }
            私有函数destination_select(EVT:事件):无效{
                destinationTxt.text = destinationDir.nativePath;
            }

            / **
             *事件监听器,当点击开始按钮
             ** /
            保护功能click_startBtn(E:的MouseEvent):无效{
                如果(sourceTxt.text ==)Alert.show(请选择源目录,警告);
                否则,如果(destinationTxt.text ==)Alert.show(请选择目标目录,警告);

                如果(checkDir(sourceTxt.text)===假)Alert.show(选择的信号源的文件夹:\ N+ sourceTxt.text +!\ n不存在,请检查,警告);
                否则,如果(checkDir(destinationTxt.text)===假)Alert.show(选定的目标文件夹:\ N+ destinationTxt.text +!\ n不存在,请检查,警告);

                //Alert.show(checkFile("D:\\New夹\\ f.txt)的toString())。
                //Alert.show(checkDir("D:\\New夹\\ f.txt)的toString())。

                workedTextArea.text =;
                currentLabel.text =;
                timeLabel.text =;
                totalDirLabel.text =;
                totalFileLabel.text =;
                copiedLabel.text =;
                skippedLabel.text =;
                uncopiedLabel.text =;

                totalDirNum = 0;
                totalFileNum = 0;
                copiedNum = 0;
                skippedNum = 0;
                uncopiedNum = 0;

                的startTime = getNow()+\ N的;

                getFileList(sourceTxt.text);
            }

            / **
             *获取当前日期和时间格式 -  YYYY-MM-DD HH:II:SS
             *
             * @返回字符串
             ** /
            公共职能getNow():字符串{
                VAR现在:日期=新的日期();
                返回now.getFullYear()+ - + now.getMonth()+ - + now.getDate()++ now.getHours()+:+ now.getMinutes()+:+ now.getSeconds();
            }

            / **
             *检查目录是存在的。
             *参数目录名:目录的路径字符串
             * @返回布尔值true或false
             ** /
            私有函数checkDir(目录名称:字符串):布尔{
                VAR DIR:文件= File.userDirectory.resolvePath(目录名);
                返回dir.isDirectory;
            }

            / **
             *检查文件是否存在。
             *参数文件名:文件的路径字符串
             * @返回布尔值true或false
             ** /
            私有函数checkFile(文件名:字符串):布尔{
                var文件:文件= File.userDirectory.resolvePath(文件名);
                返回file.exists;
            }

            / **
             * Ananlyze文件和目录的结构的
             *如果是文件夹,圈在其子文件夹。
             *如果是一个文件,复制到目标文件夹
             *
             * @参数sourceDir:字符串
             ** /
            私有函数getFileList(sourceDir:字符串):无效{
                var文件:文件= File.userDirectory.resolvePath(sourceDir);
                file.addEventListener(FileListEvent.DIRECTORY_LISTING,directory_listing);
                file.getDirectoryListingAsync();
            }

            私有函数directory_listing(E:是FileListEvent):无效{
                VAR的GetFiles:阵列= e.files;

                每个(VAR项目:文件中e.files){
                    跟踪(item.nativePath);
                    currentLabel.text =最新的+ item.nativePath;

                    如果(checkDir(item.nativePath)){
                        //这是一个目录,更多的逻辑!
                        totalDirNum ++;
                        item.addEventListener(FileListEvent.DIRECTORY_LISTING,directory_listing);
                        item.getDirectoryListingAsync();
                    }
                    其他{
                        //这是一个文件,更逻辑!
                        totalFileNum ++;
                        如果(analyzeFile(项目)===真){
                            如果(overwriteChk.selected ===假){//不覆盖相同的文件
                                如果(checkFile(destinationDir.nativePath +\\+ item.name)===假){
                                    copyInto(项目,destinationDir.resolvePath(destinationDir.nativePath +\\+ item.name));
                                    copiedNum ++;
                                }
                                其他uncopiedNum ++;
                            }
                            其他{//覆盖同名文件
                                copyInto(项目,destinationDir.resolvePath(destinationDir.nativePath +\\+ item.name));
                                copiedNum ++;
                            }

                        }
                        其他{
                            skippedNum ++;
                        }
                    }
                }

                finishTime = getNow();
                timeLabel.text =的startTime + finishTime;

                totalDirLabel.text =总导演:+ totalDirNum;
                totalFileLabel.text =文件总数:+ totalFileNum;
                copiedLabel.text =复制的文件:+ copiedNum;
                skippedLabel.text =跳过的文件:+ skippedNum;
                uncopiedLabel.text =文件未拷贝+ uncopiedNum;
            }

            / **
             *复制文件
             *参数sourceFilePointer:文件
             *参数destinationDirPointer:文件
             * @返回无效
             ** /
            私有函数copyInto(sourceFilePointer:文件,destinationDirPointer:文件):无效{
                sourceFilePointer.copyTo(destinationDirPointer,真正的);

                如果(logsChk.selected ===真)
                    workedTextArea.text + = sourceFilePointer.nativePath +\ N的;
            }

            私有函数analyzeFile(文件指针:档案):布尔{
                //Alert.show(filePointer.extension +\ N+ filePointer.size +\ N+ filePointer.name.indexOf(@));
                如果((filePointer.extension)== NULL&安培;及(filePointer.size / 1024→2)及及(filePointer.name.indexOf(@)==  -  1))
                    返回true;
                其他
                    返回false;
            }
        ]]≥
    < / FX:脚本>

    < FX:声明>
        <! - 将非视觉元素(例如,服务,价值的物品)在这里 - >
    < / FX:声明>

    &所述氏:使用BorderContainer宽度=100%高度=100%>
        &所述氏:VGroup宽度=90%的高度=10%左=0>
            &所述氏:HGroup宽度=100%>
                < S:按钮的ID =sourceBtn标签=源/>
                < S:的TextInput ID =sourceTxtWIDTH =90%fontSize的=11/>
            &所述; /秒:HGroup>
            &所述氏:HGroup宽度=100%>
                < S:按钮的ID =destinationBtn标签=目的地/>
                < S:的TextInput ID =destinationTxtWIDTH =90%fontSize的=11/>
            &所述; /秒:HGroup>
        &所述; /秒:VGroup>

        &所述氏:按钮的id =startBtn标签=开始高度=48顶端=0右=0/>

        &所述氏:HGroup顶端=50宽度=100%>
            < S:标签ID =的currentLabelWIDTH =90%高度=19文本=最新
                     设置textAlign =左verticalAlign =中间/>
            < S:复选框的id =overwriteChk标签=覆盖选择=FALSE/>
            < S:复选框的id =logsChk标签=选择=FALSE/&GT日志;
        &所述; /秒:HGroup>

        < S:文本的id =workedTextAreaX =0顶=77WIDTH =100%高度=90%编辑=假/>

        &所述氏:HGroup宽度=100%高度=10%底部=0>
            < S:标签ID =timeLabelWIDTH =20%高度=100%设置textAlign =中心verticalAlign =中间fontSize的=11/>
            < S:标签ID =totalDirLabelWIDTH =16%高度=100%设置textAlign =中心verticalAlign =中间/>
            < S:标签ID =totalFileLabelWIDTH =16%高度=100%设置textAlign =中心verticalAlign =中间/>
            < S:标签ID =copiedLabelWIDTH =16%高度=100%设置textAlign =中心verticalAlign =中间/>
            < S:标签ID =skippedLabelWIDTH =16%高度=100%设置textAlign =中心verticalAlign =中间/>
            < S:标签ID =uncopiedLabelWIDTH =16%高度=100%设置textAlign =中心verticalAlign =中间/>
        &所述; /秒:HGroup>
    &所述; /秒:使用BorderContainer>

&所述; /秒:的WindowedApplication>
 

解决方案

您的问题在于执行时间范围内。如果你想在一个执行诸事它将使用所有的CPU就可以搞定了。如果一个线程正在比X秒(通常为15),时间越长,闪光灯会放弃它说,它需要太多。执行

开始您的循环之前,采取与的getTimer(时间戳),并在该循环中,在回路检查的开始,如果startTimestamp - currentTimestamp小于5000(5秒)。如果是,打破阵列,并从你离开的地方开始过来(有或无延时,闪光灯将允许它)。

对于这种类型的操作是明智使用工人,检查的这个

下面是一个抽象的例子:

  VAR柜台:= 0; //我们的进步
VAR的startTime:INT;

功能increaseCounter():无效
{
    的startTime =的getTimer();
    而(真)//无限循环
    {
        如果(的getTimer() - 的startTime> 5000)
        {
           increaseCounter();
           打破;
        }

        反++;

        如果(柜> = int.MAX_VALUE的)//我们自定义的循环退出
        {
           跟踪(柜);
           打破;
        }
    }
}
 

I am trying to list files and directories and copy all files existing into any other folder.

By the way, there are many files and directories more than 1000 000+.

Here is a part of code.

private function getFileList(sourceDir:String):void{
    var file:File = File.userDirectory.resolvePath(sourceDir);
    file.addEventListener(FileListEvent.DIRECTORY_LISTING, directory_listing);
    file.getDirectoryListingAsync();
}
private function directory_listing(e:FileListEvent):void{
    var getfiles:Array = e.files;

    for each(var item:File in e.files){

        if(checkDir(item.nativePath)){
            // It is a directory, more logic!
            totalDirNum++;
            item.addEventListener(FileListEvent.DIRECTORY_LISTING, directory_listing);
            item.getDirectoryListingAsync();
        }
        else{
        // It is a file, more logic!
            totalFileNum++;
                if(analyzeFile(item) === true){
                if(overwriteChk.selected === false){ // Don't overwrite same file
                            if(checkFile(destinationDir.nativePath + "\\" + item.name) === false){
                            copyInto(item, destinationDir.resolvePath(destinationDir.nativePath + "\\" + item.name));
                            copiedNum++;
                        }
                        else uncopiedNum++;
                    }
                    else{ // Overwrite same file
                        copyInto(item,destinationDir.resolvePath(destinationDir.nativePath + "\\" + item.name));
                        copiedNum++;
                    }

                }
                else{
                    skippedNum++;
                    }
            }
    }

As you see, it executes recursive directory_listing().

In case of little files and directories, it works clearly.

But, for example, in the following case it not works clearly(appear not responding.)

Root Directory : A!

A includes 500 000+ subdirectories.

Each subdirectories include 4 or 5 files and one or two subdirectories.

And also the subdirectoy include a 4 or 5 files.

So, I need to copy all files of "A" folder to the specific folder (B!).

Program is stopped in first before loop. i.e. Named "A" folder include huge subfolders, so when program run to select a "A" folder, then it is stopped just in "A" folder listing(stopped at getDirectoryListingAsyc()). So, actually it is not called recursive.

Here is my full source code.

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       width="800" height="600"
                       title="eveningCopier - Niao Jina"
                       creationComplete="initApp()">
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;

            public var sourceDir:File;
            public var destinationDir:File;

            public var totalDirNum:uint;
            public var totalFileNum:uint;
            public var copiedNum:uint;
            public var skippedNum:uint;
            public var uncopiedNum:uint;

            public var startTime:String;
            public var finishTime:String;

            /**
             * Boot Function 
             **/
            public function initApp():void{
                sourceBtn.addEventListener(MouseEvent.CLICK, click_sourceBtn);
                destinationBtn.addEventListener(MouseEvent.CLICK, click_destinationBtn);
                startBtn.addEventListener(MouseEvent.CLICK, click_startBtn);

                totalDirNum     = 0;
                totalFileNum    = 0;
                copiedNum       = 0;
                skippedNum      = 0;
                uncopiedNum     = 0;
            }

            /**
             * Event Listener when click "Source" button
             **/
            protected function click_sourceBtn(e:MouseEvent):void{
                sourceDir = new File();
                sourceDir.addEventListener(Event.SELECT, select_source);
                sourceDir.browseForDirectory("Please select a source directory...");
            }
            private function select_source(evt:Event):void {
                sourceTxt.text = sourceDir.nativePath;
            }

            /**
             * Event Listener when click "Destination" button
             **/
            protected function click_destinationBtn(e:MouseEvent):void{
                destinationDir = new File();
                destinationDir.addEventListener(Event.SELECT, destination_select);
                destinationDir.browseForDirectory("Please select a source directory...");
            }
            private function destination_select(evt:Event):void {
                destinationTxt.text = destinationDir.nativePath;
            }

            /**
             * Event Listener when click "Start" button
             **/
            protected function click_startBtn(e:MouseEvent):void{
                if(sourceTxt.text == "") Alert.show("Please select a source directory", "Warning");
                else if(destinationTxt.text == "") Alert.show("Please select a destination directory", "Warning");

                if(checkDir(sourceTxt.text) === false) Alert.show("A selected Source folder:\n" + sourceTxt.text + "\n is not exist. Please check!", "Warning");
                else if(checkDir(destinationTxt.text) === false) Alert.show("A selected Destination folder:\n" + destinationTxt.text + "\n is not exist. Please check!", "Warning");

                //Alert.show(checkFile("D:\\New Folder\\f.txt").toString());
                //Alert.show(checkDir("D:\\New Folder\\f.txt").toString());

                workedTextArea.text = "";
                currentLabel.text   = "";
                timeLabel.text  = "";
                totalDirLabel.text  = "";
                totalFileLabel.text = "";
                copiedLabel.text    = "";
                skippedLabel.text   = "";
                uncopiedLabel.text  = "";

                totalDirNum     = 0;
                totalFileNum    = 0;
                copiedNum       = 0;
                skippedNum      = 0;
                uncopiedNum     = 0;

                startTime = getNow() + "\n";

                getFileList(sourceTxt.text);
            }

            /**
             * Get a current date and time as format - YYYY-MM-DD HH:II:SS
             * 
             * @return String 
             **/
            public function getNow():String{
                var now:Date = new Date();
                return now.getFullYear() + "-" + now.getMonth() + "-" + now.getDate() + " " + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds();
            }

            /**
             * Check if the directory is exist.
             * @param dirName:String Path of the directory
             * @return Boolean true or false
             **/
            private function checkDir(dirName:String):Boolean{
                var dir:File = File.userDirectory.resolvePath(dirName);
                return dir.isDirectory;
            }

            /**
             * Check if the file is exist.
             * @param fileName:String Path of the file
             * @return Boolean true or false
             **/
            private function checkFile(fileName:String):Boolean{
                var file:File = File.userDirectory.resolvePath(fileName);
                return file.exists;
            }

            /**
             * Ananlyze a structure of files and directory
             * If is a folder, loop in its subfolder.
             * If is a file, copy to the destination folder
             *  
             * @param sourceDir:String
             **/
            private function getFileList(sourceDir:String):void{
                var file:File = File.userDirectory.resolvePath(sourceDir);
                file.addEventListener(FileListEvent.DIRECTORY_LISTING, directory_listing);
                file.getDirectoryListingAsync();
            }

            private function directory_listing(e:FileListEvent):void{
                var getfiles:Array = e.files;

                for each(var item:File in e.files){
                    trace(item.nativePath);
                    currentLabel.text = "Latest In : " + item.nativePath;

                    if(checkDir(item.nativePath)){
                        // It is a directory, more logic!
                        totalDirNum++;
                        item.addEventListener(FileListEvent.DIRECTORY_LISTING, directory_listing);
                        item.getDirectoryListingAsync();
                    }
                    else{
                        // It is a file, more logic!
                        totalFileNum++;
                        if(analyzeFile(item) === true){
                            if(overwriteChk.selected === false){ // Don't overwrite same file
                                if(checkFile(destinationDir.nativePath + "\\" + item.name) === false){
                                    copyInto(item, destinationDir.resolvePath(destinationDir.nativePath + "\\" + item.name));
                                    copiedNum++;
                                }
                                else uncopiedNum++;
                            }
                            else{ // Overwrite same file
                                copyInto(item, destinationDir.resolvePath(destinationDir.nativePath + "\\" + item.name));
                                copiedNum++;
                            }

                        }
                        else{
                            skippedNum++;
                        }
                    }
                }

                finishTime  = getNow();
                timeLabel.text = startTime + finishTime;

                totalDirLabel.text  = "Total Dir : " + totalDirNum;
                totalFileLabel.text = "Total Files : " + totalFileNum;
                copiedLabel.text    = "Copied Files : " + copiedNum;
                skippedLabel.text   = "Skipped Files : " + skippedNum;
                uncopiedLabel.text  = "Uncopied Files : " + uncopiedNum;
            }

            /**
             * Copy files
             * @param sourceFilePointer:File
             * @param destinationDirPointer:File
             * @return void
             **/
            private function copyInto(sourceFilePointer:File, destinationDirPointer:File):void{
                sourceFilePointer.copyTo(destinationDirPointer, true);

                if(logsChk.selected === true)
                    workedTextArea.text += sourceFilePointer.nativePath + "\n";
            }

            private function analyzeFile(filePointer:File):Boolean{
                //Alert.show(filePointer.extension + "\n" + filePointer.size + "\n" + filePointer.name.indexOf("@"));
                if((filePointer.extension) == null && (filePointer.size/1024 > 2) && (filePointer.name.indexOf("@") == -1))
                    return true;
                else
                    return false;
            }
        ]]>
    </fx:Script>

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

    <s:BorderContainer width="100%" height="100%">
        <s:VGroup width="90%" height="5%" left="0">
            <s:HGroup width="100%">
                <s:Button id="sourceBtn" label="Source"/>
                <s:TextInput id="sourceTxt" width="90%" fontSize="11"/>
            </s:HGroup>
            <s:HGroup width="100%">
                <s:Button id="destinationBtn" label="Destination"/>
                <s:TextInput id="destinationTxt" width="90%" fontSize="11"/>
            </s:HGroup>
        </s:VGroup>

        <s:Button id="startBtn" label="Start" height="48" top="0" right="0"/>

        <s:HGroup top="50" width="100%">            
            <s:Label id="currentLabel" width="90%" height="19" text="Latest In : "
                     textAlign="left" verticalAlign="middle"/>
            <s:CheckBox id="overwriteChk" label="Overwrite" selected="false"/>
            <s:CheckBox id="logsChk" label="Logs" selected="false"/>
        </s:HGroup>

        <s:TextArea id="workedTextArea" x="0" top="77" width="100%" height="90%" editable="false"/>

        <s:HGroup width="100%" height="5%" bottom="0">          
            <s:Label id="timeLabel" width="20%" height="100%" textAlign="center" verticalAlign="middle" fontSize="11"/>
            <s:Label id="totalDirLabel" width="16%" height="100%" textAlign="center" verticalAlign="middle"/>
            <s:Label id="totalFileLabel" width="16%" height="100%" textAlign="center" verticalAlign="middle"/>
            <s:Label id="copiedLabel" width="16%" height="100%" textAlign="center" verticalAlign="middle"/>
            <s:Label id="skippedLabel" width="16%" height="100%" textAlign="center" verticalAlign="middle"/>
            <s:Label id="uncopiedLabel" width="16%" height="100%" textAlign="center" verticalAlign="middle"/>
        </s:HGroup>
    </s:BorderContainer>    

</s:WindowedApplication>

解决方案

Your problem lies within the execution time. If you're trying to perform everything in one go it will use all the CPU it can get. If one thread is being executed for longer than X seconds (usually 15), flash will abort it saying it takes too much.

Before starting your loop, take a timestamp with getTimer() and in the loop, in the beginning of your loop check if the startTimestamp - currentTimestamp is less than 5000 (5 seconds). If it is, break the array and start it over (with or without delay, flash will allow it) from the place you've left.

For this type of operations it would make sense to use workers, check this.

Here's an abstract example:

var counter:int = 0; // our progress
var startTime:int;

function increaseCounter():void
{
    startTime = getTimer();
    while(true) // infinite loop
    {
        if (getTimer() - startTime  > 5000)
        {
           increaseCounter();
           break;
        }

        counter++;

        if (counter >= int.MAX_VALUE) // our custom loop exit
        {
           trace(counter);
           break;
        }
    }
}

这篇关于清单大量的文件和目录包含在Adobe AIR子目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆