0

我有以下代码:获取文件使用Chrome应用API

decodeFile = function(theFile, arrayBuffer) { 
     var song = new FileDecoder().decodeFile(theFile.type, arrayBuffer); 
     if (song !== null) { 
      fileList.push(song); 
     } 
    }, 
    fileCreated = function(file) { 
     var reader = new FileReader(); 
     reader.onload = function(e) { 
      decodeFile(file, e.target.result); 
     }; 
     reader.readAsArrayBuffer(file); 
    }, 
    readDirItems = function(items) { 
     var i, item, 
      length = items.length; 
     for(i = 0; i < length; i++) { 
      item = items[i]; 
      if (item.isFile) { 
       item.file(fileCreated, errorCallback); 
      } 
     } 
    }; 
//init 
uploadInput.addEventListener("click", function() { 
    chrome.fileSystem.chooseEntry({type: "openDirectory"}, function(chosenDir) { 
     var dirReader, 
      getFilesInDirectory = function() { 
       dirReader.readEntries(readDirItems, errorCallback); 
      }; 
     if (chosenDir && chosenDir.isDirectory) { 
      dirReader = chosenDir.createReader(); 
      getFilesInDirectory(); 
     } 
    }); 
}); 

我怎么想到这工作是,在readDirItems我会循环,虽然所有的项目和每个FileEntry的调用file方法和进入fileCreated回调。但是,这只发生在第一个文件中。如果我在fileCreated断点,它只输入一次。任何人都可以解释我做错了什么?

回答

2

适合我。你的代码比这个问题所需要的复杂得多,所以这里是一个更简单的版本。在清理代码的过程中可能会修复该错误。

的manifest.json

{ 
    "name": "20184022", 
    "description": "Answer to Stack Overflow question 20184022.", 
    "manifest_version": 2, 
    "minimum_chrome_version": "31", 
    "version": "0.0.0.1", 

    "app": { 
    "background": { 
     "scripts": ["main.js"] 
    } 
    }, 
    "permissions": [ 
    {"fileSystem": ["directory"]} 
    ] 
} 

main.js

chrome.app.runtime.onLaunched.addListener(function() { 
    chrome.app.window.create('main.html', {}); 
}); 

main.html中

<!DOCTYPE html> 
<html> 
<head><script src="iterate.js"></script></head> 
<body><button id="iterate">Iterate</button></body> 
</html> 

iterate.js

window.onload = function() { 
    var errorCallback = function(e) { 
    console.log(e); 
    } 
    document.querySelector("#iterate").addEventListener("click", function() { 
    chrome.fileSystem.chooseEntry({type: "openDirectory"}, function(dir) { 
     if (dir && dir.isDirectory) { 
     var reader = dir.createReader(); 
     reader.readEntries(function(entries) { 
      for (var i = 0; i < entries.length; ++i) { 
      console.log("entry is " + entries[i].fullPath); 
      } 
     }, errorCallback); 
     } 
    }); 
    }); 
}; 

...和样品运行:

entry is /20184022/manifest.json iterate.js:13 
entry is /20184022/iterate.js iterate.js:13 
entry is /20184022/main.js iterate.js:13 
entry is /20184022/main.html iterate.js:13 

我建议你逐渐改变你的代码,这个样品不一致,那么一旦你的代码更改从损坏的固定,确定问题是什么,并更新你的问题点出错。

+0

我同意你的代码更清洁,但是我的问题是,当通过'readEntries'中的文件循环访问我调用的每个条目(在你的情况下)'entries [i] .file(fileCreated,errorCallback)',第一个文件进入fileCreated方法。 – shortspider

+0

我建议你逐渐地将你的特定功能引入到这个示例中,当它停止时停下来,并找出错误。由于google-chrome-app标签,我遇到了这个问题。我对您的问题的HTML5部分没有任何特殊的知识。 – sowbug

+0

不知道问题出在哪里,但是在你稍微移动了一些东西之后,建议代码似乎可以工作。虽然它有点奇怪,但如果我在上面的'fileCreated'中断点,它仍然只输入一次,但是目录中的所有文件都被读取。 – shortspider

相关问题