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

相關問題