gpt4 book ai didi

Javascript 文件删除和读取目录 - 异步递归

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:25:17 24 4
gpt4 key购买 nike

所以我正在尝试创建一个文件转换器 Web 应用程序。现在,用户可以将文件拖放到屏幕上,我可以阅读它们,包括拖放目录中的所有文件。但是,我不知道脚本何时完成读取文件。

部分代码:

第一个函数处理“drop”事件,并将遍历每个文件并将其发送到另一个函数,该函数将读取其内容。

function readDrop( evt )
{
for( var i = 0; i < evt.dataTransfer.files.length; i++)
{
var entry = evt.dataTransfer.items[i].webkitGetAsEntry();

if(entry)
readContents(entry, "");
}

//Do stuff after all files and directories have been read.
}

此函数是一个递归的 FileEntry 读取器。如果它是一个文件,我将读取 FileEntry。如果是一个目录,它会循环遍历内容并通过这个函数传递。

function readContents(entry, path)
{
if( entry.isFile )
{
readFileData( entry, path, function(fileData)
{
_MyFiles.push( fileData );
});
}
else if( entry.isDirectory )
{
var directoryReader = entry.createReader();
var path = path + entry.name;

directoryReader.readEntries(function(results)
{
for( var j = 0; j < results.length; j++ )
{
readContents(entry, path);
}

}, errorHandler)
}
}

这是我读取文件的功能。回调只是将 fileData 对象推送到全局数组

function readFileData(entry, path, callback)
{
var fileData = {"name": entry.name, "size": 0, "path": path, "file": entry};

entry.file(function(file)
{
fileData["size"] = file.size;
callback( fileData );
}
}

我不确定从这里去哪里,以便在所有文件和目录都已读取后我可以回调。

最佳答案

FileSystem API 似乎不太适合完整的递归遍历任务,这也许是其他 vendor 未采用它的部分原因。无论如何,我认为通过神秘的 Promises 组合我能够实现这个目标:

    function traverse_directory(entry) {
let reader = entry.createReader();
// Resolved when the entire directory is traversed
return new Promise((resolve_directory) => {
var iteration_attempts = [];
(function read_entries() {
// According to the FileSystem API spec, readEntries() must be called until
// it calls the callback with an empty array. Seriously??
reader.readEntries((entries) => {
if (!entries.length) {
// Done iterating this particular directory
resolve_directory(Promise.all(iteration_attempts));
} else {
// Add a list of promises for each directory entry. If the entry is itself
// a directory, then that promise won't resolve until it is fully traversed.
iteration_attempts.push(Promise.all(entries.map((entry) => {
if (entry.isFile) {
// DO SOMETHING WITH FILES
return entry;
} else {
// DO SOMETHING WITH DIRECTORIES
return traverse_directory(entry);
}
})));
// Try calling readEntries() again for the same dir, according to spec
read_entries();
}
}, errorHandler );
})();
});
}

traverse_directory(my_directory_entry).then(()=> {
// AT THIS POINT THE DIRECTORY SHOULD BE FULLY TRAVERSED.
});

关于Javascript 文件删除和读取目录 - 异步递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18815197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com