Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取所有文件和文件夹结构的JSON对象_Javascript_Cordova_Cordova Plugins - Fatal编程技术网

Javascript 如何获取所有文件和文件夹结构的JSON对象

Javascript 如何获取所有文件和文件夹结构的JSON对象,javascript,cordova,cordova-plugins,Javascript,Cordova,Cordova Plugins,我尝试用Cordova构建一个函数,它给了我一个JSON对象,如下所示: { "file:///storage/emulated/0/Android/data/test/files/data/bla.txt": "bla.txt", "file:///storage/emulated/0/Android/data/test/files/data/HelloWorld.txt": "HelloWorld.txt", "file:///storage/emulated/0/Android

我尝试用Cordova构建一个函数,它给了我一个JSON对象,如下所示:

{
  "file:///storage/emulated/0/Android/data/test/files/data/bla.txt": "bla.txt",
  "file:///storage/emulated/0/Android/data/test/files/data/HelloWorld.txt": "HelloWorld.txt",
  "file:///storage/emulated/0/Android/data/test/files/data/RSC/picture-1469199158993.jpg": "picture-1469199158993.jpg",
  "file:///storage/emulated/0/Android/data/test/files/data/RSC/picture-1469199665434.jpg": "picture-1469199665434.jpg",
  "file:///storage/emulated/0/Android/data/test/files/data/API-Test/test/datFile.txt": "datFile.txt",
  "file:///storage/emulated/0/Android/data/test/files/data/RSC/thumbnails/picture-1469199158993.jpg": "picture-1469199158993.jpg",
  "file:///storage/emulated/0/Android/data/test/files/data/RSC/thumbnails/picture-1469199665434.jpg": "picture-1469199665434.jpg"
}
我的问题是Cordova函数是异步的,所以我的函数返回一个空对象

到目前为止,我的解决方案如下:

var dirObj = new Object();

function getFiles(fullPath, callback){
    dirObj = new Object();

    window.resolveLocalFileSystemURL(fullPath, addFileEntry, function(e){
            console.error(e);
    });

    return JSON.stringify(dirObj);    
}

var addFileEntry = function (entry) {
  var dirReader = entry.createReader();
  dirReader.readEntries(
    function (entries) {
      var fileStr = "";
      for (var i = 0; i < entries.length; i++) {
        if (entries[i].isDirectory === true) {
          addFileEntry(entries[i]);
        } else {
          dirObj[entries[i].nativeURL] = entries[i].name;
          console.log(entries[i].fullPath);
        }
      }
    },
    function (error) {
      console.error("readEntries error: " + error.code);
    }
  );
};
var dirObj=新对象();
函数getFiles(完整路径、回调){
dirObj=新对象();
resolveLocalFileSystemURL(完整路径、addFileEntry、函数(e){
控制台错误(e);
});
返回JSON.stringify(dirObj);
}
var addFileEntry=函数(条目){
var dirReader=entry.createReader();
dirReader.readEntries(
功能(条目){
var fileStr=“”;
对于(变量i=0;i

注意:Promise()不是一个选项,因为该函数必须在Chrome 30.0上运行,Promise()从32.0()开始可用。

我找到了一个类似于@AxelH建议解决方案的解决方案。 我使用了一个数组: 每次调用函数addFileEntry时,我都会将一个id推入数组。当函数完成时,我从数组中删除了id。如果数组为空,则调用回调函数


感谢@AxelH的帮助,感谢@gcampbell提到bluebird,我不知道它会用于javascript中的其他异步问题。

我找到了一个类似于@AxelH建议解决方案的解决方案。
var dirObj;

function getFiles(fullPath, callback){
    dirObj = new Object();

    window.resolveLocalFileSystemURL(fullPath, addFileEntry, function(e){
            console.error(e);
    });
}

var counter = 0;

var addFileEntry = function (entry) {
  ++counter;
  var dirReader = entry.createReader();
  [...] //you probably should do it in the readEntries function to since this is async to (as you said), because this could still run while the following line might be executed. If so, just add the same if(...) callback();
  if(--counter == 0)
      callBack();
};

function callBack(){
   var json = JSON.stringify(dirObj);
   //Do what you need with it.
}
我使用了一个数组: 每次调用函数addFileEntry时,我都会将一个id推入数组。当函数完成时,我从数组中删除了id。如果数组为空,则调用回调函数


感谢@AxelH的帮助,感谢@gcampbell提到bluebird,我不知道它将用于javascript中的其他异步问题。

您可以使用回调或promise polyfill(例如bluebird)?可能与@AxelH重复,您如何决定是否完成递归函数来调用回调?递归函数调用本身是异步的。如果目录读取器不给您选择权,那么您将对每个异步函数调用的每个入口和出口进行计数(开始时递增,退出时递减)。主调用应在计数器为零时完成。这太难看了。。。所以我会尝试用另一种方式创建这个JSON。你能使用回调或promise polyfill(例如Bluebird)吗?@AxelH的可能副本,以及你如何决定递归函数调用回调是否完成?递归函数调用本身是异步的。如果目录读取器不给您选择权,那么您将对每个异步函数调用的每个入口和出口进行计数(开始时递增,退出时递减)。主调用应在计数器为零时完成。这太难看了。。。因此,我尝试用另一种方式创建这个JSON。是的,使用数组与递增变量相同,但由于需要生成id,然后再次查找它,所以需要更重一些。让我用我的方式写,这样你就可以结束这个问题,如果这对你来说是确定的。我认为这对其他人也会有帮助。是的,使用数组与递增变量相同,但由于需要生成id,然后再次查找它,因此需要更大的工作量。让我用我的方式写,这样你就可以结束这个问题,如果这对你来说是确定的。我认为这对其他人也有帮助。
var dirObj;

function getFiles(fullPath, callback){
    dirObj = new Object();

    window.resolveLocalFileSystemURL(fullPath, addFileEntry, function(e){
            console.error(e);
    });
}

var counter = 0;

var addFileEntry = function (entry) {
  ++counter;
  var dirReader = entry.createReader();
  [...] //you probably should do it in the readEntries function to since this is async to (as you said), because this could still run while the following line might be executed. If so, just add the same if(...) callback();
  if(--counter == 0)
      callBack();
};

function callBack(){
   var json = JSON.stringify(dirObj);
   //Do what you need with it.
}