Search code examples
javascriptandroidhtmlcordovahtml5-filesystem

How to create nested directories in Phonegap


I have tried this, but it didn't satisfy my request at all. I write a new one:

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 ");
}

Although the directories are created, the it sends me

ErrorCallback:"alert("Recursively create directories error.");"

First, I don't think this code will work since I have tried this, which failed:

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());
}

I just repeatedly call fs.root.getDirectory only but it failed. But the first one is almost the same...

  1. What is the problem at all? Why does the first one always gives me the ErrorCallback?
  2. Why can't the second one work?
  3. Does anyone has a better solution? (no ErrorcallBack msg)

ps: I work on Android and PhoneGap 1.7.0.


Solution

  • I am not able to figure out mistake in your code. I have a library written to do localIO via PhoneGap 2.0. I have abstracted code for your requirements from there. See if it works for 1.7. I have not tested the code after abstraction. You may need to fix error, if any.

      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);