node js: est-fs.renommer remplacer le fichier s'il existe déjà
N'fs.renommer remplacer le fichier s'il existe déjà?
var fs = require('fs'),
oldPath = 'firstfile.txt',
newPath = 'temp/firstfile.txt';
fs.rename(oldPath, newPath, function (err) {
console.log('rename callback ', err);
});
Ce qui se passe si '/newFolder/somefile.txt' existe déjà ?
- Je reçois l'Erreur: ENOENT, renommer 'c:\test\firstfile.txt'
Vous devez vous connecter pour publier un commentaire.
Réponse courte: oui
Réponse longue:
J'ai créé un script pour vérifier:
Créer deux fichiers:
Renommer:
Vérifier si elle était surchargée:
rename()
sur Windows normalement ne pas le faire, mais il semble le faire pour le nœud. Pourquoi est-ce que/où est-ce documenté?nodejs est
fs.rename()
écrase les fichiers parce que c'est la façon dont les Unixrename()
est défini etfs.rename()
est documenté comme emballage de larename()
Unix syscall. Je ne sais pas de n'importe quel endroit dans le nodejs docs directement les états en ce qui concernefs.rename()
. Cependant, il y a un certain nombre d'éléments qui permettent de déterminer:La nodejs docs lien vers la page de manuel Linux pour
rename(2)
lors de la description de la fonctionnalité defs.renommer
. Le GitHub permalien de la documentation n'a pas linkify, mais le processeur se met automatiquementrename(2)
enrename(2)
.La “Appels et les pages de manuel” de la section de la documentation états que les syscalls émuler unix comportement sur Windows. Je déduis cela à partir de la phrase “il est parfois impossible de remplacer Unix syscall sémantique sur Windows”, ce qui implique que nodejs a mis en œuvre sémantique Unix sur Windows quand il est possible:
J'ai vu d'autres discussions sur ce genre de choses et les gens toujours se référer à la façon de nodejs utilise juste libuv de choses, donc il y a juste à regarder libuv. libuv l'objectif est de fournir un portable asynchrone de mise en œuvre de l'Api POSIX, et donc l'un de ses objectifs est de se comporter comme unix, même sur Windows. Le libuv docs ne semblent pas discuter
rename()
à la longueur, mais les Fenêtres de la mise en œuvre defs__rename()
appelsMoveFileEx()
parMOVEFILE_REPLACE_EXISTING
.Oh, et j'ai presque oublié. Même si vous savez que nodejs définit
fs.rename()
comme POSIXrename()
, peut-être que vous ne connaissez pas le POSIX définit le comportement derename()
concernant la réécriture:Simplement, il décrit les opérations de remplacement de fichier si la cible de la renommer existe déjà. Si un fichier du même nom existe déjà avant de faire appel à
rename()
, il ne cessera jamais d'exister, même si votre programme se bloque ou de la boîte perd de la puissance. À un certain point dans le temps, le nouveau nom va commencer en se référant au fichier avec l'ancien nom.Vous devriez préférer cette méthode de plus en supprimant le fichier d'origine, puis de renommer le nouveau car ensuite le fichier dans le nouveau chemin d'accès cessera d'exister momentanément (éventuellement à l'origine d'une condition de concurrence pour quelque chose en essayant de l'ouvrir) ou, si le processus est tué ou une panne de courant qui arrive au bon moment, de façon permanente.
Remarque: en raison de problèmes de portabilité, il est bon d'envisager l'utilisation de la portabilité des aides comme
gracieuse-fs
etde la croix-spawn
lorsque vous souhaitez que votre code de travail aussi pour les utilisateurs de Windows. Je me rends compte que n'est pas le sens de la question, mais j'ai déduit que le demandeur aurait seulement poser une telle question, parce que d'un win32 contexte où renommer ne pouvez pas écraser les fichiers ou parce que l'on voudrais seulement poser une question comme cela quand intéressés à la portabilité au-delà Unix.Il ressemble à fr.renommer offre les mêmes fonctionnalités que le Linux renommer(2) de commande fournit (source: Déplacez le Fichier dans ExpressJS/NodeJS). Cela dit, si vous regardez la documentation pour Linux renommer(2) de commande, ils disent que si le nom de fichier que vous renommez existe déjà, le nom de fichier existant sera remplacé et écrasées (source: http://linux.die.net/man/2/rename)