traverseFileTree.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. function loopFiles(item, callback) {
  2. var dirReader = item.createReader();
  3. var fileList = [];
  4. function sequence() {
  5. dirReader.readEntries(function (entries) {
  6. var entryList = Array.prototype.slice.apply(entries);
  7. fileList = fileList.concat(entryList);
  8. // Check if all the file has been viewed
  9. var isFinished = !entryList.length;
  10. if (isFinished) {
  11. callback(fileList);
  12. } else {
  13. sequence();
  14. }
  15. });
  16. }
  17. sequence();
  18. }
  19. var traverseFileTree = function traverseFileTree(files, callback, isAccepted) {
  20. // eslint-disable-next-line @typescript-eslint/naming-convention
  21. var _traverseFileTree = function _traverseFileTree(item, path) {
  22. // eslint-disable-next-line no-param-reassign
  23. item.path = path || '';
  24. if (item.isFile) {
  25. item.file(function (file) {
  26. if (isAccepted(file)) {
  27. // https://github.com/ant-design/ant-design/issues/16426
  28. if (item.fullPath && !file.webkitRelativePath) {
  29. Object.defineProperties(file, {
  30. webkitRelativePath: {
  31. writable: true
  32. }
  33. });
  34. // eslint-disable-next-line no-param-reassign
  35. file.webkitRelativePath = item.fullPath.replace(/^\//, '');
  36. Object.defineProperties(file, {
  37. webkitRelativePath: {
  38. writable: false
  39. }
  40. });
  41. }
  42. callback([file]);
  43. }
  44. });
  45. } else if (item.isDirectory) {
  46. loopFiles(item, function (entries) {
  47. entries.forEach(function (entryItem) {
  48. _traverseFileTree(entryItem, "".concat(path).concat(item.name, "/"));
  49. });
  50. });
  51. }
  52. };
  53. files.forEach(function (file) {
  54. _traverseFileTree(file.webkitGetAsEntry());
  55. });
  56. };
  57. export default traverseFileTree;