PhoneGap 检查文件是否存在

PhoneGap check if file exists

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

中尝试过建议的解决方案

但是 none 这些解决方案对我有用。这是我基于 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.

使用博客中建议的代码 post 问题完全相同,即调用了两个函数。

您的代码将 called 函数作为回调传递,而不是函数本身。让我举个例子。假设你有函数 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);

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