0

This code is designed to recursively iterate through a selected directory using the file system access api , and sent it via axios post request.

I have an encountered 2 problems :

  1. I am struggling to find the right way to to enter subdirectories (now it only works for a directory with only files and no subDirs)

  2. as you can see , i set a timeout before the post request , for some reason I cant identify , the promise in savedOCS function , probably resolves before it should.

I have the following code :

async uploadDirectory () {
        const directoryHandle = await window.showDirectoryPicker();
        const t0 = performance.now();
        console.log(`t0 ${t0}`);
        this.setState({chosenDirectory: directoryHandle.name} , ()=> {
            console.log(this.state.chosenDirectory);
        });
        await this.handleDirectoryEntry(directoryHandle);
        const t4 = performance.now();
        console.log(`t4 ${t4}`);
        setTimeout(() => {
            this.axios.post(
                '/DirectoryTransfer', {
                directory: this.state.chosenDirectory,
                directoryFiles: this.state.directoryFiles
                }
            ).then((resData) => {
            // this.fetchRemoteFileSystem();
            const t5 = performance.now();
            console.log(`t5 ${t5}`);
            }).catch((error) => {
            console.log(error)
            })
        }, 5000);

    }

    

    async handleDirectoryEntry(directoryHandle,subdir) { 
        let fileEntries = [];
        console.log(directoryHandle);
        for await (const entry of directoryHandle.values()) { 
            console.log(entry);
            if(entry.kind === "file" && subdir === '') {
                fileEntries.push(await entry.getFile());
            }
        }
        console.log(fileEntries);
        await this.saveDocs(fileEntries);
    }

    saveDocs = async (files) => {
        const filePromises = files.map((file) => {
            return new Promise ((resolve ,reject)=> {
                const fileReader = new FileReader();
                fileReader.onload = async  ()=> {
                    try {
                        let directoryFiles = this.state.directoryFiles || [];
                        console.log('before setState: ', directoryFiles)
                        let response  = false;
                        const t2 = performance.now();
                        console.log(`t2 ${t2}`)
                        await this.setState(
                            (prevState) => ({
                              directoryFiles: [...prevState.directoryFiles, { name: file.name, data: fileReader.result }]
                            }),
                            () => {
                              response = true;
                              console.log("after setState: ", this.state.directoryFiles);
                              const t3 = performance.now();
                              console.log(`t3 ${t3}`)
                            }
                        );
                        resolve(response);
                    } catch(err) {
                        reject(err)
                    }
                }
                fileReader.onerror = (err) => {
                    reject(err);
                }
                fileReader.readAsText(file);
            })
        })
        const fileInfos = await Promise.all(filePromises);
        return fileInfos;
    }

i tried to find a way to iterate subDirs using recursion , and to async read files inside a directory.

current results :

  • the code reads the files fine.
  • without the timeout it sends a post request with an empty array of files.
  • doesn't have an implementation for subDirs.
Kostas Minaidis
  • 4,681
  • 3
  • 17
  • 25

0 Answers0