Windows winJS复制文件夹树以安装win8.1应用程序内容

Windows winJS复制文件夹树以安装win8.1应用程序内容,windows,asynchronous,promise,winjs,deep-copy,Windows,Asynchronous,Promise,Winjs,Deep Copy,我实际上正在用js和html开发一个Windows8.1应用程序,该应用程序包含大量大文件,我需要多次安装和更新。所以我已经开发了一个fct,可以从usb设备更新到本地数据应用文件夹。它的工作很好,但我的fct不是建立在承诺和它不容易跟踪的进展和完成。。。 所以我正在研究一种全新的fct,但它不起作用;o(有人能在承诺结构方面帮助我吗 我的实际代码: app.copyTree = function (srcRootSorageFolder, destRootStorageFolder) {

我实际上正在用js和html开发一个Windows8.1应用程序,该应用程序包含大量大文件,我需要多次安装和更新。所以我已经开发了一个fct,可以从usb设备更新到本地数据应用文件夹。它的工作很好,但我的fct不是建立在承诺和它不容易跟踪的进展和完成。。。 所以我正在研究一种全新的fct,但它不起作用;o(有人能在承诺结构方面帮助我吗

我的实际代码:

app.copyTree = function (srcRootSorageFolder, destRootStorageFolder) {
    console.log('copy tree Start...');
    var fileToCopy = 0;
    var fileCopied = 0;
    var foldToCreate = 0;
    var foldCreated = 0;
    //-- init and wait promiseS ....
    scanFolder(srcRootSorageFolder, destRootStorageFolder).then(
            function () {
                console.log('successfull copy !!');
                console.log(fileCopied + ' fichier(s) copié(s) sur ' + fileToCopy);
                console.log(foldCreated + ' dossier(s) créé(s) sur ' + foldToCreate);
            },
            function error(error) {
                console.log('error copy' + error);                    
                console.log(fileCopied + ' fichier(s) copié(s) sur ' + fileToCopy);
                console.log(foldCreated + ' dossier(s) créé(s) sur ' + foldToCreate);
            }
    );

    //--sub fct with promise to scan a folder and launch copy
    function scanFolder(srcFoldStorage, destFoldStorage) {
        console.log('scanFolder Start...');
        var promises = [];
        return new WinJS.Promise(function (complete, error) {
            promises.push(
                srcFoldStorage.getFilesAsync().then(function (filesList) {
                    fileToCopy += filesList.size;
                    copyFiles(filesList, destFoldStorage);
                })
            );
            promises.push(
                srcFoldStorage.getFoldersAsync().then(function (foldersList) {
                    foldToCreate += foldersList.size;
                    loopSubFolder(foldersList, destFoldStorage);
                })
            );
            WinJS.Promise.join(promises).then(
                    function () {
                        complete();
                    },
                    error
            );
        });
    }


    //--sub fct with promise to copy all sub-folders in a folder to a destination
    function loopSubFolder(foldersList, destStorFolder) {
        console.log('loopSubFolder Start...');
        var promises = [];
        var collideOpt = Windows.Storage.CreationCollisionOption.openIfExists;
        return new WinJS.Promise(function (complete, error) {
            foldersList.forEach(function (reg) {
                var foldName = reg.name;
                promises.push(
                   destStorFolder.createFolderAsync(foldName, collideOpt).then(
                    function (newFoldStorage) {
                        foldCreated += 1;
                        scanFolder(reg, newFoldStorage);
                    })
                );
            });
            WinJS.Promise.join(promises).then(
                function () {
                    complete();
                },
                error
            );
        });
    };

    //--sub fct with promise to copy all file in a folder to a destination
    function copyFiles(filesList, destStorFolder) {
        console.log('copyFiles Start...');
        var promises = [];
        var collideOpt = Windows.Storage.CreationCollisionOption.replaceExisting;

        return new WinJS.Promise(function (complete, error) {
            filesList.forEach(function (reg) {
                var fName = reg.name;
                promises.push(
                   reg.copyAsync(destStorFolder, fName, collideOpt).then(fileCopied += 1)
                );
            });
            WinJS.Promise.join(promises).then(
                function () {
                    complete();
                },
                error
            );
        });
    };
    //--

};
谢谢你的帮助


Mr

所以,像许诺和递归一样,他们并不是我真正的朋友……像上帝和邪恶一样……我改变了我的工作方式,找到了一个完全有效且更简单的解决方案

我决定在我的源文件夹中搜索文件,然后查看完成的文件数…我不知道为什么一开始我不使用此解决方案…这样,我可以取得某种进展,并确保所有文件都已完成

如果它能帮助其他有同样需求的人,我的代码如下:

app.copyFolder = function (srcRootSorageFolder, destRootStorageFolder) {
    //srcRootSorageFolder & destRootStorageFolder need to be StorageFolder ( IAsyncOperation<StorageFolder>)
    var totalFiles = 0;     //total files to copy
    var totalSize = 0;      //total octects to copy
    var doneCopies = 0;     // files copy terminated    
    var doneSize = 0;       // octets copied

    //Prepare query to Search all files (deep search / recursive ) in the srcRootSorageFolder to follow progress
    var queryOptions = new Windows.Storage.Search.QueryOptions();
    queryOptions.folderDepth = Windows.Storage.Search.FolderDepth.deep;
    var query = srcRootSorageFolder.createFileQueryWithOptions(queryOptions);


    //--sub function to prepare progress (counting files and size)
    function prepareProgress(files) {
        var promises = [];
        return new WinJS.Promise(function (complete, error) {
            files.forEach(function (file) {
                promises.push(                       
                    file.getBasicPropertiesAsync().then(function (props) {                           
                        totalFiles += 1;
                        totalSize += props.size;
                    })
                )
            });                
            WinJS.Promise.join(promises).then(
                    function () {
                        complete(files);
                    },
                    error
            );
        });
    }

    //--sub function to copy files
    function copyFiles(files) {
        var promises = [];
        var folderCollideOpt = Windows.Storage.CreationCollisionOption.openIfExists;
        var fileCollideOpt = Windows.Storage.CreationCollisionOption.replaceExisting;
        return new WinJS.Promise(function (complete, error) {
            files.forEach(function (file) {
                var destPath = file.path.split(srcRootSorageFolder.path);       // get the folder tree to create directory tree of the source folder in the dest folder
                destPath = destPath[destPath.length - 1];                       //keeping last element of the array
                destPath = destPath.substring(1, destPath.lastIndexOf('\\'));   //removing file name en 1st slash(\)
                var fName = file.name;
                promises.push(            
                    destRootStorageFolder.createFolderAsync(destPath, folderCollideOpt).then(
                        function (destStorage) {
                            //dest folder ready, initialising ... start copying file
                            file.copyAsync(destStorage, fName, fileCollideOpt).then(
                                function (newFile) {
                                    updateProgress(file,newFile);
                                });
                        }
                    )                        
                )
            });
            WinJS.Promise.join(promises).then(
                    function () {
                        complete(files);
                    },
                    error
            );
        });
    }
    //--sub function to follow progress and defined if all copy are completed
    function updateProgress(file,newFile) {
        return new WinJS.Promise(function (complete, error) {
            newfiles.getBasicPropertiesAsync().then(function (newProps) { console.log('ok (copy):' + newfiles.name + ':' + newProps.size); });
            file.getBasicPropertiesAsync().then(function (props) {
                doneCopies += 1;
                doneSize += props.size;
                console.log('ok (source):' + file.name + ':' + props.size);
                //progress
                var copiesProgress = Math.round((doneSize / totalSize) * 100 * 100) / 100; // copy percent with 2 decimals
                console.log('progress: ' + copiesProgress + '%');
                //completed action
                if (doneCopies == totalFiles) {
                    console.log('Copy Done');
                }
            });
        });
    }

    //--initialising process
    query.getFilesAsync().then(prepareProgress).then(copyFiles).then(console.log('Copy Start....'));


 };
app.copyFolder=函数(srcRootSorageFolder、destRootStorageFolder){
//srcRootSorageFolder和destRootStorageFolder需要是StorageFolder(IAsyncOperation)
var totalFiles=0;//要复制的文件总数
var totalSize=0;//要复制的八位字节总数
var doneCopies=0;//文件复制已终止
var doneSize=0;//复制了八位字节
//准备查询以搜索srcRootSorageFolder中的所有文件(深度搜索/递归),以跟踪进度
var queryOptions=new Windows.Storage.Search.queryOptions();
queryOptions.folderDepth=Windows.Storage.Search.folderDepth.deep;
var query=srcRootSorageFolder.createFileQueryWithOptions(queryOptions);
//--准备进度的子功能(计算文件和大小)
函数prepareProgress(文件){
var承诺=[];
返回新的WinJS.Promise(函数(完成,错误){
forEach(函数(文件){
承诺。推动(
file.getBasicPropertiesAsync().then(函数(props){
totalFiles+=1;
totalSize+=道具尺寸;
})
)
});                
承诺。加入(承诺)。然后(
函数(){
完成(文件);
},
错误
);
});
}
//--复制文件的子函数
功能复制文件(文件){
var承诺=[];
var folderCollideOpt=Windows.Storage.CreationCollisionOption.openIfExists;
var fileCollideOpt=Windows.Storage.CreationCollisionOption.replaceExisting;
返回新的WinJS.Promise(函数(完成,错误){
forEach(函数(文件){
var destPath=file.path.split(srcRootSorageFolder.path);//获取文件夹树以在dest文件夹中创建源文件夹的目录树
destPath=destPath[destPath.length-1];//保留数组的最后一个元素
destPath=destPath.substring(1,destPath.lastIndexOf('\\');//删除第一斜杠(\)中的文件名
var fName=file.name;
承诺。推动(
destRootStorageFolder.createFolderAsync(destPath,folderCollideOpt)。然后(
功能(存储){
//dest文件夹就绪,正在初始化…开始复制文件
copyanc(destStorage、fName、fileCollideOpt)(
函数(新文件){
updateProgress(文件,新文件);
});
}
)                        
)
});
承诺。加入(承诺)。然后(
函数(){
完成(文件);
},
错误
);
});
}
//--跟踪进度的子功能,并在所有副本完成时定义
函数updateProgress(文件,新文件){
返回新的WinJS.Promise(函数(完成,错误){
newfiles.getBasicPropertiesAsync().then(函数(newProps){console.log('ok(复制):'+newfiles.name+':'+newProps.size);});
file.getBasicPropertiesAsync().then(函数(props){
doneCopies+=1;
doneSize+=props.size;
console.log('确定(源):'+file.name+':'+props.size);
//进展
var copiesProgress=Math.round((doneSize/totalSize)*100*100)/100;//用2位小数复制百分比
log('progress:'+copiesProgress+'%');
//完成的行动
if(doneCopies==totalFiles){
console.log(“复制完成”);
}
});
});
}
//--初始化过程
query.getfileasync().then(prepareProgress).then(copyFiles).then(console.log('Copy Start…'));
};
我希望你喜欢,如果你有意见,使它更好,我会喜欢! 谢谢


Mr

“它不工作”?什么不工作?你能说得更具体一点吗?我想你指的是一个函数,用你不寻常的缩写词“fct”?嗨,是的,fct代表函数,对不起。我的问题是,除了第一级操作(第一个子文件夹和文件)(scanFolder函数)外,一切都开始正常返回承诺,我不能等待/跟踪进程的结束。嗨,只是一个细节,复制和文件夹创建工作完美,只是函数不等待进程结束返回承诺;o(