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