【问题标题】:Unable to delete file using cordova?无法使用cordova删除文件?
【发布时间】:2016-07-02 10:22:19
【问题描述】:

我正在这里保存我的文件:/storage/emulated/0/myApp/helloworld.wav

我正在尝试删除此文件

        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, successCallback, errorCallback)

        function successCallback(fs) {
            fs.root.getFile('/storage/emulated/0/myApp/helloworld.wav', {
                create: false
            }, function(fileEntry) {
                fileEntry.remove(function() {
                    alert('File removed.');
                }, errorCallback);
            }, errorCallback);
        }

        function errorCallback(error) {
            alert("ERROR: " + error.code)
        }

它不会删除文件并且总是返回error code 1(未找到)。谁能帮我指出哪里出了问题。

当我从文件管理器中检查时,这是我的文件的物理位置:/storage/emulated/0/myApp/helloworld.wav 但它总是返回错误代码 1

【问题讨论】:

  • 嗨,你能分享更新的sn-p来删除文件而不是文件目录吗?谢谢

标签: cordova ionic-framework cordova-plugins


【解决方案1】:

我觉得下面这行可能是问题所在, "window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, successCallback, errorCallback)"

在我阅读的一些帖子中,有人提到 requestfilsystem 方法和 LocalFileSystem.PERSISTENT 参数在 android 中不起作用,除非设备是 root 的。

我使用 - "window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory,successCallback, errorCallback);"

使它工作

如果需要,我可以分享删除目录的示例代码以及其中的文件。请告诉我。希望对您有所帮助。

这是根据请求的示例代码,

function clearDirectory() {

    if (sessionStorage.platform.toLowerCase() == "android") {
        window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, onFileSystemDirSuccess, fail);
    } else {
        //for ios
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemDirSuccess, fail);
    }
};

function onFileSystemDirSuccess(fileSystem) {
    var entry = "";
    if (sessionStorage.platform.toLowerCase() == "android") {
        entry = fileSystem;
    } else {
        //for ios
        entry = fileSystem.root;
    }
    entry.getDirectory("Folder_Name", {
            create: true,
            exclusive: false
        },
        function(entry) {
            entry.removeRecursively(function() {
                console.log("Delete successful !!!");
            }, fail);
        }, getDirFail);
};

function getDirFail(error) {
    alert("getDirFail - " + error.code);
};

function fail(error) {
    alert("fail - " + error.code);
};

文件创建:

function writeFile() {
            if (sessionStorage.platform.toLowerCase() == "android") {
                window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, onFileSystemSuccess, onError);
            } else {
                window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, onError);
            }

        }    

        function onError(e) {
            alert("onError");
        };

        function onFileSystemSuccess(fileSystem) {
            var entry = "";
            if (sessionStorage.platform.toLowerCase() == "android") {
                entry = fileSystem;
            } else {
                entry = fileSystem.root;
            }
            entry.getDirectory("Folder_Name", {
                create: true,
                exclusive: false
            }, onGetDirectorySuccess, onGetDirectoryFail);
        };

        function onGetDirectorySuccess(dir) {
            dir.getFile(filename, {
                create: true,
                exclusive: false
            }, gotFileEntry, errorHandler);
        };

        function gotFileEntry(fileEntry) {
            // logic to write file in respective directory
        };

        function errorHandler(e) {
            // handle error
        }

【讨论】:

  • LocalFileSystem.PERSISTENT 确实适用于写入文件。我将尝试使用 resolveLocalFileSystemURL。您可以在答案中发布您的代码,那就太好了
  • @LeonardoDaCodinchi,已在我的回复中发布了代码。如果有帮助,请告诉我
  • 这会删除目录,而不是文件。当我尝试 getFile 时,它​​会抛出此错误 Cannot read property 'getFile' of undefined
  • @LeonardoDaCodinchi,它会删除目录及其中的文件。有趣的是,在我的例子中,我可以调用 getfile 函数来创建文件。在我的原始回复中添加了示例 sn-p。
  • 文件是否需要存储在某个特定位置以便将来可以删除?我的文件位置是/storage/emulated/0/myApp/helloworld.wav
【解决方案2】:

也许最好使用具有本机功能的插件,它将文件保存在应保存的位置,并保证您具有读写访问权限。

您可以在这里查看:cordova-plugin-file

我不知道您尝试在哪种设备中使用该代码。在该页面中,您可以看到到不同操作系统(Android、iOS、Blackberry 等)的所有不同文件系统路径。

【讨论】:

  • 我很想知道为什么投反对票,实际的正确答案使用了这个插件常量。在原始问题中没有。。谁投反对票,我很想知道为什么,我我只是想帮忙,我不认为我投反对票是错误的。干杯:)
  • 您的问题最终出现在低质量帖子队列中,因为它有被标记为“仅链接答案”的风险。仅供参考。(不,我没有对你投反对票,所以我可以帮不上忙)
  • 太棒了!谢谢你的解释。下一个答案的质量更好:)
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 2023-03-06
  • 2013-07-12
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多