PhoneGap检查文件是否存在

时间:2015-09-01 10:29:44

标签: ios cordova phonegap-plugins phonegap-build

我想检查文件是否存在,如果不存在,请下载它。我在this SO questionthis blog post

中尝试过建议的解决方案

但这些解决方案都不适合我。这是基于SO问题的代码:

 window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
                console.log("gotFS");
                getFolder(fileSystem, video.folderName, function(folder) {
                    console.log("Got folder");
                    var filePath = folder.toURL() + "\/" + "videotest.mp4";

                    fileSystem.root.getFile(filePath, { create: false }, playVideo(filePath, true), transferFile(video.uri, filePath));


                }, function() {
                    console.log("failed to get folder");
                });

            },
            function() {
                console.log("failed to get filesystem");
            });

播放视频功能如下:

 function playVideo(uri, hasBeenDownloaded) {

   console.log("was video dowloaded already", hasBeenDownloaded);
    var player = document.getElementById("videoPlayer");
    var source = document.createElement("source");

    source.src = uri;
    source.type = "video/mp4";

    player.appendChild(source);
    player.load();
}

这里是transferFile函数:

function transferFile(uri, filePath) {
       var transfer = new FileTransfer();
       transfer.download(
           uri,
           filePath,
           function (entry) {
               var targetPath = entry.toURL();

               console.log("target path je", targetPath);
               document.getElementById("result").innerHTML = "File saved to: " + targetPath;
               playVideo(targetPath, false);

           },
           function (error) {
               document.getElementById("result").innerHTML = "An error has occurred: Code = " + error.code;
               console.log("download error source " + error.source);
               console.log("download error target " + error.target);
               console.log("upload error code" + error.code);
           }
           );
   }

无论文件是否存在,会发生playVideo和transferFile的调用。

例如,如果文件已存在,则首先只调用playVideo,并在控制台中记录:

was video dowloaded already: true

过了一段时间后,我看到调用了transferFile函数,当下载文件时,它将调用playVideo,在控制台中我可以看到:

was video dowloaded already: false

那为什么会这样呢?

P.S。

在博客文章中建议的代码完全相同,即两个函数都被调用。

1 个答案:

答案 0 :(得分:1)

您的代码将调用函数作为回调传递,而不是函数本身。让我举个例子。想象一下你有Foo的功能。它要求你传递2个回调函数 - 一个用于成功,一个用于失败。你可以这样做:

function good() { alert('good'); };
function bad() { alert('bad'); };

foo(good, bad);

然而,这就是你所做的:

foo(good(), bad());

这就是你们两个被召唤的原因。你需要改变:

 fileSystem.root.getFile(filePath, { create: false }, playVideo(filePath, true), transferFile(video.uri, filePath));

fileSystem.root.getFile(filePath, { create: false }, playVideo, transferFile);

这意味着您需要访问您不需要作为参数但作为常规变量的值。