如何在Phonegap中创建嵌套目录

4

我尝试过这个方法,但它并不能完全满足我的需求。我写了一个新的方法:

var file_system;
var fs_root;
window.requestFileSystem(LocalFileSystem.PERSISTENT, 1024*1024, onInitFs, request_FS_fail);

function onInitFs(fs) {
  file_system= fs;
  fs_root= file_system.root;
  alert("ini fs");
  create_Directory();
  alert("ini fs done.");
}
var string_array;
var main_dir= "story_repository/"+ User_Editime;
string_array= new Array("story_repository/",main_dir, main_dir+"/rec", main_dir+"/img","story_repository/"+ User_Name );

function create_Directory(){
  var start= 0;
  var path="";
  while(start < string_array.length) {
    path = string_array[start];
    alert(start+" th created directory " +" is "+ path);
    fs_root.getDirectory(
      path,
      {create: true, exclusive: false},
      function(entry) {
        alert(path +"is created.");
      },
      create_dir_err()
    );
    start++;
  }//while loop
}//create_Directory

function create_dir_err() {
  alert("Recursively create directories error.");
}

function request_FS_fail() {
  alert("Failed to request File System ");
}

尽管目录已经创建,但仍会出现以下错误:

ErrorCallback:"alert("递归创建目录时发生错误。");"

首先,我认为这段代码不会起作用,因为我尝试过并失败了:

window.requestFileSystem(
  LocalFileSystem.PERSISTENT,
  0,
  //request file system success callback.
  function(fileSys) {
    fileSys.root.getDirectory(
      "story_repository/"+ dir_name,
      {create: true, exclusive: false},
      //Create directory story_repository/Stallman_time.
      function(directory) {
        alert("Create directory: "+ "story_repository/"+ dir_name);
        //create dir_name/img/
        fileSys.root.getDirectory {
          "story_repository/"+ dir_name + "/img/",
          {create: true, exclusive: false},
          function(directory) {
            alert("Create a directory: "+ "story_repository/"+ dir_name + "/img/");
            //check.
            //create dir_name/rec/
            fileSys.root.getDirectory {
              "story_repository/"+ dir_name + "/rec/",
              {create: true, exclusive: false},
              function(directory) {
                alert("Create a directory: "+ "story_repository/"+ dir_name + "/rec/");
                //check.
                //Go ahead.
              },
              createError
            }
            //create dir_name/rec/
          },
          createError
        }
        //create dir_name/img
      },
      createError
    );
  },
  //Create directory story_repository/Stallman_time.
  createError());
}

我只是重复调用了fs.root.getDirectory,但是它失败了。但第一个几乎是相同的……

  1. 到底出了什么问题?为什么第一个总是给我ErrorCallback错误信息?
  2. 为什么第二个不能工作?
  3. 有没有更好的解决方案?(没有ErrorcallBack消息)

PS:我在Android和PhoneGap 1.7.0上工作。


请在JavaScript中使用try-catch,然后让我知道是否需要帮忙。 - skhurams
尝试这个函数 onSuccess(fileSystem) { console.log(fileSystem.name); }// 请求持久文件系统 window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onSuccess, onError); - skhurams
http://docs.phonegap.com/en/2.2.0/cordova_file_file.md.html#DirectoryEntry - skhurams
@skhurams 2.2.0文档仍未告诉我们如何创建嵌套目录...我将尝试在稍后使用onSuccess(filesystem)... - Alston
当您使用 onsuccess 时,它会告诉您错误信息。 - skhurams
同时使用错误回调函数,这将为您提供错误代码。function onError(evt) { console.log(evt.target.error.code); } - skhurams
3个回答

1

有一个适用于cordova-phoengap的简易文件管理器:

https://github.com/torrmal/cordova-simplefilemanagement

你可以递归地创建目录:

//CREATE A DIRECTORY RECURSIVELY

var a = new DirManager(); // Initialize a Folder manager
a.create_r('folder_a/folder_b',Log('created successfully'));

1

我无法找出你代码中的错误。我已经编写了一个通过PhoneGap 2.0进行本地IO操作的库。我从中抽象出了符合你要求的代码。看看它是否适用于1.7版本。我在抽象后没有测试过代码。如果有任何错误,你可能需要修复。

  var fsroot = fs.root; // initialize this

  function fileGetDir(path, cb) {
    var fnGetOrCreateDir = function(p, de) {
      var entry = p.shift();
      if (entry) {
        de.getDirectory(entry, {
          create : true
        }, function(dirEntry) {
          fnGetOrCreateDir(p, dirEntry);
        }, fileFSError);
      } 
      else
        if (cb) cb(de);
    };

    if (path) {
      var arPath = path.split("/");
      fnGetOrCreateDir(arPath, fsroot);
    }
    else {
      if (cb) cb(fsroot);
    }
  }

  function fileFSError(e) {
    console.log(e.code);
    try {
      console.log("fileFSError: " + JSON.stringify(e));
    } catch (err) {}
  }

function printSuccess(dirEntry) {
    console.log(dirEntry.fullPath);
}

// Now create your directories like:
var main_dir= "story_repository/"+ User_Editime;
fileGetDir(mainDir + "/rec", printSuccess);
fileGetDir(mainDir + "/img", printSuccess);
fileGetDir("story_repository/"+ User_Name, printSuccess);

我稍后会查看。目前我被其他烦人的问题打扰了...抱歉。 - Alston
你的例子仅仅创建了一个目录,即“story_repository/”+User_Editime+“/rec”。但是我需要连续创建很多个目录,比如:“story_repository/”+dir_name+“/img/”、“story_repository/”+dir_name+“/rec/”、“XXX”,并且可以在任意路径创建这些目录。 - Alston
为什么不针对每个目录调用它? - closure

-1

如果根目录下的第一个目录“story_repository”不存在,则您对getDirectory的第一次调用将调用错误回调,因为在不存在的目录中创建dir_name的调用将在本地端出现错误。

“story_repository”存在吗?


是的,它确实存在。我尝试了两种方法:一种是手动创建“story_repository”,另一种是使用以下示例: 我通过在string_array中给出第一个元素来创建目录。 string_array= new Array("story_repository/",main_dir, main_dir+"/rec", main_dir+"/img","story_repository/"+ User_Name ); 应该首先创建story_repository,而它确实被创建了。然而,错误回调仍然发生。成功回调也发生了... - Alston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接