Jak sprawdzić istnienie pliku ?
W dokumentacji modułu fs
znajduje się opis metody fs.exists(path, callback)
. Ale, jak rozumiem, sprawdza, czy istnieją tylko katalogi. I muszę sprawdzić plik !
Jak to zrobić?
Jak sprawdzić istnienie pliku ?
W dokumentacji modułu fs
znajduje się opis metody fs.exists(path, callback)
. Ale, jak rozumiem, sprawdza, czy istnieją tylko katalogi. I muszę sprawdzić plik !
Jak to zrobić?
fs.access('file', err => err ? 'does not exist' : 'exists')
patrz fs.accessOdpowiedzi:
Dlaczego po prostu nie spróbować otworzyć pliku?
fs.open('YourFile', 'a', function (err, fd) { ... })
w każdym razie po minucie wyszukiwania spróbuj tego:Obie
path.exists
ifs.exists
zostały wycofane*Edytować:
Zmieniono:
else if(err.code == 'ENOENT')
do:
else if(err.code === 'ENOENT')
Linter narzeka, że podwójne równa się, a nie potrójne równe.
Korzystanie z fs.stat:
źródło
fs.exists
też działa. Miałem problemy z uprawnieniami do pliku.path.exists
faktycznie jest przestarzały na korzyśćfs.exists
fs.exists
ifs.existsSync
również został uznany za przestarzały. Najlepszym sposobem sprawdzenia istnienia pliku jestfs.stat
pokazany powyżej.fs.existsSync
nie jest już pozbawiony praw, chociażfs.exists
nadal jest.Łatwiejszy sposób na zrobienie tego synchronicznie.
Dokument API mówi, jak
existsSync
działa:sprawdź, czy podana ścieżka istnieje, sprawdzając w systemie plików.
źródło
fs.existsSync(path)
jest teraz przestarzała, zobacz nodejs.org/api/fs.html#fs_fs_existssync_path . W przypadku synchronicznej implementacjifs.statSync(path)
, zobacz moją odpowiedź.fs.existsSync
został wycofany, ale już nim nie jest.Edycja: Od węzła
v10.0.0
możemy użyćfs.promises.access(...)
Przykładowy kod asynchroniczny, który sprawdza, czy plik istnieje:
Alternatywą dla statystyki może być użycie nowego
fs.access(...)
:zminimalizowana funkcja krótkiej obietnicy do sprawdzania:
Przykładowe użycie:
rozszerzony sposób Promise:
lub jeśli chcesz to zrobić synchronicznie:
źródło
fs.constants.F_OK
itp. Czy można również uzyskać do nich dostępfs.F_OK
? Dziwne. Również zwięzłe, co jest miłe.fs.promises.access(path, fs.constants.F_OK);
po prostu jako Obietnica zamiast tworzyć Obietnicę.fs.exists(path, callback)
ifs.existsSync(path)
są teraz przestarzałe, zobacz https://nodejs.org/api/fs.html#fs_fs_exists_path_callback i https://nodejs.org/api/fs.html#fs_fs_existssync_path .Aby przetestować istnienie pliku synchronicznie, można użyć np.
fs.statSync(path)
.fs.Stats
Zostanie zwrócony obiekt, jeśli plik istnieje, patrz https://nodejs.org/api/fs.html#fs_class_fs_stats , w przeciwnym razie zostanie zgłoszony błąd, który zostanie przechwycony przez instrukcję try / catch.źródło
fs
pochodzi zmiennafs.existsSync()
nie jest już przestarzały.Stara wersja przed V6: oto dokumentacja
AKTUALIZACJA
Nowe wersje z V6: dokumentacja dla
fs.stat
źródło
fs.exists
ifs.existsSync
są przestarzałe zgodnie z udostępnionym przez Ciebie linkiem.existsSync
nie jest przestarzały zgodnie z tym dokumentem, może to być, gdy go czytałeś.Nowoczesny sposób async / await (Node 12.8.x)
Musimy użyć,
fs.stat() or fs.access()
ponieważfs.exists(path, callback)
teraz jest przestarzałyInnym dobrym sposobem jest fs-extra
źródło
fs.exists
jest przestarzały od 1.0.0. Możesz użyćfs.stat
zamiast tego.Oto link do dokumentacji fs.stats
źródło
stats.isFile()
nie potrzebujefilename
.@Fox: świetna odpowiedź! Oto trochę rozszerzenia z kilkoma dodatkowymi opcjami. To jest to, czego ostatnio używam jako rozwiązanie:
PS sprawdź fs-extra, jeśli jeszcze go nie używasz - to całkiem słodkie. https://github.com/jprichardson/node-fs-extra )
źródło
Istnieje wiele niedokładnych komentarzy na temat
fs.existsSync()
wycofania; nie jest.https://nodejs.org/api/fs.html#fs_fs_existssync_path
źródło
async/await
wersja używającautil.promisify
od Węzła 8:źródło
źródło
Po krótkich eksperymentach stwierdziłem, że poniższy przykład
fs.stat
jest dobrym sposobem asynchronicznego sprawdzania, czy plik istnieje. Sprawdza również, czy Twój „plik” to „naprawdę-jest-plikiem” (a nie katalogiem).Ta metoda używa Promises, zakładając, że pracujesz z asynchroniczną bazą kodu:
Jeśli plik nie istnieje, obietnica nadal zostanie rozwiązana
false
. Jeśli plik istnieje i jest katalogiem, zostanie rozwiązanytrue
. Wszelkie błędy przy próbie odczytania pliku będąreject
obietnicą samego błędu.źródło
Cóż, zrobiłem to w ten sposób, jak widać na https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback
Czy jest z tym jakiś problem?
źródło
w dawnych czasach przed siadaniem zawsze sprawdzam, czy jest krzesło, potem siadam, mam inny plan, jak siedzenie na trenerze. Teraz witryna node.js sugeruje przejście (nie trzeba sprawdzać), a odpowiedź wygląda następująco:
kod zaczerpnięty z http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/ z marca 2014 roku i nieco zmodyfikowany, aby pasował do komputera. Sprawdza również uprawnienia - usuń uprawnienia do testowania
chmod a-r foo.txt
źródło
vannilla Nodejs callback
z docs powiedzieć należy użyć
access()
jako zamiennik za przestarzałeexists()
Nodejs z obietnicą kompilacji (węzeł 7+)
Popularny framework javascript
FS-extra
Jak widać o wiele prostsze. A zaletą w stosunku do obietnicy jest to, że w tym pakiecie masz kompletną pisownię (pełna inteligencja / maszynopis)! W większości przypadków uwzględnisz już tę bibliotekę, ponieważ (+ -10.000) inne biblioteki są od niej zależne.
źródło
Możesz użyć
fs.stat
do sprawdzenia, czy cel jest plikiem lub katalogiem i możesz użyćfs.access
do sprawdzenia, czy możesz zapisać / odczytać / wykonać plik. (pamiętaj, aby użyć,path.resolve
aby uzyskać pełną ścieżkę do celu)Dokumentacja:
Pełny przykład (TypeScript)
źródło
Dla wersji asynchronicznej! I w wersji obiecanej! Tutaj czysty, prosty sposób!
Bardziej praktyczny fragment mojego kodu, aby lepiej zilustrować:
Powyższy przykład służy tylko do demonstracji! Mogłem użyć zdarzenia błędu strumienia odczytu! Wyłapać błędy! I pomiń te dwie rozmowy!
źródło