Zgodnie z documentation plik node.js fs.exists() zostanie uznany za przestarzały. Ich argumentacja:node.js fs.exists() będzie przestarzałe, co należy zamiast tego użyć?
fs.exists() jest anachronizmem i istnieje tylko z przyczyn historycznych. Nie powinno prawie nigdy istnieć powód, aby używać go we własnym kodzie.
W szczególności sprawdzenie, czy plik istnieje przed otwarciem, jest wzorcem zapobiegającym narażeniu na warunki wyścigu: inny proces może usunąć plik między wywołaniami fs.exists() i fs.open(). Po prostu otwórz plik i obsłuż błąd, gdy go nie ma.
fs.exists() zostanie uznany za przestarzały.
Obecnie używam go przed przenoszeniem plików, ponieważ fs.rename() wydaje się po cichu nadpisywać pliki o tej samej nazwie w folderze docelowym.
Moje pytanie brzmi; co powinienem zamiast tego użyć, aby zapobiec nadpisywaniu pliku fs.rename() w folderze docelowym? Zakładam, że istnieje sposób, o którym nie wiem. W przeciwnym razie nie widzę powodu, dla którego fs.exists() ma być przestarzałe.
Używanie fs.open() jako sugerowanej wydaje się przesadą, ponieważ nie chcę otwierać pliku.
Edit, jak na życzenie użytkownika @ jfriend00 uzyskać więcej informacji o tym, co robię.
Robię aplikację Electron, w której użytkownik może sortować pliki do różnych katalogów. Nie jest to oprogramowanie serwerowe, przeznaczone jest do codziennego korzystania z komputerów, obsługi ich dokumentów. Jest to kod do tej pory do przenoszenia pliku:
function moveFile(destIndex){
var from = queue[currentQueueIndex].path;
var to = destinations[destIndex].path + path.sep + path.basename(from);
console.log("[i] Move file (from/to): ");
console.log(from);
console.log(to);
//Check if file exists, if yes: give them the choice to cancel.
fs.stat(to, function (err, stats) {
if (err){
move(from, to);
} else {
var confirmed = confirm("File already exists, will overwrite.");
if (confirmed) {
move(from, to);
}
}
});
next(); //Show the next file to the user
}
function move(from, to){
fs.rename(from, to, function (err) {
if (err) throw err;
console.log('[i] Move successful');
queue[currentQueueIndex].path = to;
queue[currentQueueIndex].moved = true;
});
}
Po pierwszym komentarzu, część zaczynając fs.stat, sprawdzić, czy plik mam zamiar stworzyć z fs.rename już istnieje. Sądzę, że jest to zależne od warunków wyścigowych, ale nie mogę stwierdzić, że fs.rename w jakikolwiek sposób obsługuje duplikaty.
Ponieważ ta aplikacja jest przeznaczona do "komputerów domowych", nie sądzę, aby miał miejsce scenariusz, w którym plik znika między sprawdzaniem statystyk a zmianą nazwy. Ale nadal, im więcej potencjalnych problemów mogę uniknąć, tym lepiej.
Co dokładnie próbujesz użyć 'fs .exists() 'for? Potrzebujemy jeszcze kilku szczegółów na temat sekwencji kodu, zanim będziemy mogli zasugerować coś, co nie jest podatne na warunki wyścigu? Chodzi o to, że każdy substytut, który tylko sprawdza istnienie, a następnie przeprowadza akcję opartą na tej wiedzy, podlega warunkom wyścigu i istnieje prawdopodobnie lepszy sposób na jego kodowanie. – jfriend00
@ jfriend00 - Dodałem, co robię do głównego pytania, a także kod do niego. – Blargmode
W przypadku monitu użytkownika końcowego na komputerze o niewielkiej liczbie użytkowników, wynikowy wyścig prawdopodobnie nie dotyczy. Prawdziwą odpowiedzią byłaby wersja 'fs.rename()', która nie nadpisałaby celu, więc możesz go nazwać w ten sposób i tylko wtedy, gdy nie uda się przepisać, ponieważ cel istnieje, wtedy pytasz i zmieniasz argument do 'fs.rename()', aby umożliwić nadpisanie. To nigdy nie zostanie nadpisane bez pierwszego pytania. Ale zgodziłbym się - prawdopodobnie nie jest potrzebny w tego typu przypadku użycia. – jfriend00