| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 | export const byteKB = 1024;export const byteMB = 1048576;export function getFileSize(number: number): string {    if (number < byteKB) {        return `${(number / byteKB).toFixed(2) }KB`;    } else if (number >= byteKB && number < byteMB) {        return `${(number / byteKB).toFixed(1) }KB`;    } else if (number >= byteMB) {        return `${(number / byteMB).toFixed(1) }MB`;    }    return undefined;}export function endsWith(str: string, suffix: string): boolean {    return str.indexOf(suffix, str.length - suffix.length) !== -1;}export async function loopFiles(item: FileSystemDirectoryEntry): Promise<Array<FileSystemEntry>> {    return new Promise((res, rej) => {        const dirReader = item.createReader();        let fileList: Array<FileSystemEntry> = [];        function sequence(): void {            dirReader.readEntries(entries => {                const entryList = Array.prototype.slice.apply(entries);                fileList = fileList.concat(entryList);                // Check if all the file has been viewed                const isFinished = !entryList.length;                if (isFinished) {                    res(fileList);                } else {                    sequence();                }            }, rej);        }        sequence();    });}export async function mapFileTree(items: Array<DataTransferItem>): Promise<Array<File>> {    const promises: Array<Promise<File>> = [];    const _traverseFileTree = async (item: FileSystemEntry, path?: string): Promise<void> => {        path = path || '';        //@ts-ignore add path property into item        item.path = path;        if (item.isFile) {            promises.push(new Promise((res, rej) => {                (item as FileSystemFileEntry).file(file => {                    if (item.fullPath && !file.webkitRelativePath) {                        // This file is provided to the user based on the relative path of the drag and drop folder                        // If you drag the Upload folder, the path of the internal file may be Upload/File/a.png, etc                        Object.defineProperties(file, {                            webkitRelativePath: {                                writable: true,                            },                        });                        //@ts-ignore add webkitRelativePath property into file                        file.webkitRelativePath = item.fullPath.replace(/^\//, '');                        Object.defineProperties(file, {                            webkitRelativePath: {                                writable: false,                            },                        });                    }                    res(file);                }, rej);            }));        } else if (item.isDirectory) {            const entries = await loopFiles(item as FileSystemDirectoryEntry);            for (let index = 0; index < entries.length; index++) {                const entry = entries[index];                await _traverseFileTree(entry, `${path}${item.name}/`);            }        }    };    try {        const batches = items.map(i => _traverseFileTree(i.webkitGetAsEntry()));        // Perform asynchronous operations to add the required promises to the queue        await Promise.all(batches);        // Execution queue        const result = await Promise.all(promises);        return result;    } catch (error) {        console.warn('Captured error while loop directory.');        console.error(error);        return [];    }}
 |