isaacs / node-graceful-fs

fs with incremental backoff on EMFILE
ISC License
1.27k stars 148 forks source link

Different speed of file rename to non-accessible destination on Windows #247

Open xmedeko opened 6 months ago

xmedeko commented 6 months ago

Hello, I'm trying to rename file to a destination folder where the user has no access, rename fails with EPERM error correctly, but when the target file exists, it fails immediately, when the target file does not exists, it fails after 60 sec. E.g. my code:

const util = require('util');
const gfsRename = util.promisify(require('graceful-fs').rename);
(async () => {
  const start = Date.now();
  try {
    await gfsRename("somefile.txt", "c:\\Program Files\\somefile.txt");
  } catch (err) {
    console.log("graceful-fs.rename error in", Date.now() - start, err.message);
  }
})();

Since I have no antivirus which would require to use this rename - retry workaround, I am not able to test if such difference is reasoned or a bug.

I think the problem is in the solution of #98 and commit 90a96bc2104729e51d5d7b4aebc8c584ccf7d2ce, see also code https://github.com/isaacs/node-graceful-fs/blob/234379906b7d2f4c9cfeb412d2516f42b0fb4953/polyfills.js#L107 IMHO fs.stat result should be checked that target is a directory, too.

Note: to fail fast if AV is blocking the rename, could be possible to open and close target, something like fs.open(src, 'a') ... fs.close(...) ? If so, it may not be part of the library, but could be documented in README.md only, I think.