deno icon indicating copy to clipboard operation
deno copied to clipboard

removeSync() NotFound error while folder exists when used on Network Drive on Windows

Open cderv opened this issue 2 years ago • 2 comments

I encounter some error when trying to remove a folder on a network drive on Windows (e.g Mounted Google Drive)

// I am on a network drive
> Deno.cwd()
"G:\\Mon Drive\\Projects"
> import { existsSync } from "https://deno.land/[email protected]/fs/exists.ts";
undefined
// creating a directory
> Deno.mkdirSync("new_dir");
undefined
> await Deno.writeTextFile("new_dir/hello.txt", "Hello World!");
undefined
// It is seen as existing
> existsSync('new_dir')
true
// And seen as not empty
> Deno.removeSync('new_dir')
Uncaught Error: Le répertoire n’est pas vide. (os error 145): remove 'new_dir'
    at Object.removeSync (ext:deno_fs/30_fs.js:175:7)
    at <anonymous>:2:6
// But still NotFound when I try to remove it
> Deno.removeSync('new_dir', {recursive: true})
Uncaught NotFound: Le fichier spécifié est introuvable. (os error 2): remove 'new_dir'
    at Object.removeSync (ext:deno_fs/30_fs.js:175:7)
    at <anonymous>:2:6

Is there some specific limitation which such Drive on Windows ? Or alternative to use ?

> deno --version
deno 1.33.1 (release, x86_64-pc-windows-msvc)
v8 11.4.183.1
typescript 5.0.3

cderv avatar May 05 '23 09:05 cderv

I believe the issue has evolved because now the directory is deleted, even if there is an error message thrown

$ deno --version
deno 1.38.5 (release, x86_64-pc-windows-msvc)
v8 12.0.267.1
typescript 5.2.2
> Deno.cwd()
"G:\\Mon Drive\\TESTING"
> import { existsSync } from "https://deno.land/[email protected]/fs/exists.ts";
undefined
> Deno.mkdirSync("new_dir");
undefined
> await Deno.writeTextFile("new_dir/hello.txt", "Hello World!");
undefined
// Folder exists
> existsSync('new_dir')
true
// Listing dir
>   async function getNames(currentPath: string) {
    const names: string[] = [];

    for await (const dirEntry of Deno.readDir(currentPath)) {
      const entryPath = `${currentPath}/${dirEntry.name}`;
      names.push(entryPath);

      if (dirEntry.isDirectory) {
        names.push(await getNames(entryPath));
      }
    }

    return names;
  }
undefined
// Not empty
>   console.log(await getNames(Deno.cwd()));
[
  "G:\\Mon Drive\\TESTING/new_dir",
  [ "G:\\Mon Drive\\TESTING/new_dir/hello.txt" ]
]

> Deno.removeSync('new_dir')
Uncaught Error: Le répertoire n’est pas vide. (os error 145): remove 'new_dir'
    at Object.removeSync (ext:deno_fs/30_fs.js:189:7)
    at <anonymous>:1:27
// Removing with recursive does error 
> Deno.removeSync('new_dir', {recursive: true})
Uncaught NotFound: Le fichier spécifié est introuvable. (os error 2): remove 'new_dir'
    at Object.removeSync (ext:deno_fs/30_fs.js:189:7)
    at <anonymous>:1:27
// However, directory is deleted
> existsSync('new_dir')
false

> console.log(await getNames(Deno.cwd()));
[]
undefined

Has anything change that would lead to this behavior ?

cderv avatar Dec 14 '23 17:12 cderv

While looking at a new issue, I know understand the problem is with empty directories.

> Deno.cwd()
"G:\\Mon Drive\\TESTING"
> Deno.mkdirSync("new_dir");
undefined
> Deno.mkdirSync("new_dir/empty_dir");
undefined
> Deno.mkdirSync("new_dir/not_empty");
undefined
> await Deno.writeTextFile("new_dir/not_empty/hello.txt", "Hello World!");
undefined
> import { existsSync } from "https://deno.land/[email protected]/fs/exists.ts";
undefined
> // Listing dir
undefined
> async function getNames(currentPath: string) {
    const names: string[] = [];

    for await (const dirEntry of Deno.readDir(currentPath)) {
      const entryPath = `${currentPath}/${dirEntry.name}`;
      names.push(entryPath);

      if (dirEntry.isDirectory) {
        names.push(await getNames(entryPath));
      }
    }

    return names;
  }
undefined
> console.log(await getNames(Deno.cwd()));
[
  "G:\\Mon Drive\\TESTING/new_dir",
  [
    "G:\\Mon Drive\\TESTING/new_dir/empty_dir",
    [],
    "G:\\Mon Drive\\TESTING/new_dir/not_empty",
    [ "G:\\Mon Drive\\TESTING/new_dir/not_empty/hello.txt" ]
  ]
]
undefined

Removing empty dir works, but errors

> Deno.removeSync('new_dir/empty_dir', {recursive: true})
Uncaught NotFound: Le fichier spécifié est introuvable. (os error 2): remove 'new_dir/empty_dir'
    at Object.removeSync (ext:deno_fs/30_fs.js:188:7)
    at <anonymous>:1:27
> console.log(await getNames(Deno.cwd()));
[
  "G:\\Mon Drive\\TESTING/new_dir",
  [
    "G:\\Mon Drive\\TESTING/new_dir/not_empty",
    [ "G:\\Mon Drive\\TESTING/new_dir/not_empty/hello.txt" ]
  ]
]
undefined

Removing not empty dir works but errors

> Deno.removeSync('new_dir/not_empty', {recursive: true})
Uncaught NotFound: Le fichier spécifié est introuvable. (os error 2): remove 'new_dir/not_empty'
    at Object.removeSync (ext:deno_fs/30_fs.js:188:7)
    at <anonymous>:1:27
> console.log(await getNames(Deno.cwd()));
[ "G:\\Mon Drive\\TESTING/new_dir", [] ]
undefined

And if we try the whole new_dir, it will fail to remove because it will remove one directory, but errors while removing when empty

> Deno.mkdirSync("new_dir/empty_dir");
undefined
> Deno.mkdirSync("new_dir/not_empty");
undefined
> await Deno.writeTextFile("new_dir/not_empty/hello.txt", "Hello World!");
undefined
> console.log(await getNames(Deno.cwd()));
[
  "G:\\Mon Drive\\TESTING/new_dir",
  [
    "G:\\Mon Drive\\TESTING/new_dir/empty_dir",
    [],
    "G:\\Mon Drive\\TESTING/new_dir/not_empty",
    [ "G:\\Mon Drive\\TESTING/new_dir/not_empty/hello.txt" ]
  ]
]
undefined
> Deno.removeSync('new_dir', {recursive: true})
Uncaught NotFound: Le fichier spécifié est introuvable. (os error 2): remove 'new_dir'
    at Object.removeSync (ext:deno_fs/30_fs.js:188:7)
    at <anonymous>:1:27
> console.log(await getNames(Deno.cwd()));
[
  "G:\\Mon Drive\\TESTING/new_dir",
  [ "G:\\Mon Drive\\TESTING/new_dir/empty_dir", [] ]
]
undefined
>

As we see it has errored, but not_empty has been correctly removed

> deno --version
deno 1.39.0 (release, x86_64-pc-windows-msvc)
v8 12.0.267.8
typescript 5.3.3

cderv avatar Dec 20 '23 16:12 cderv