2014-12-14 13 views
5

Powodem, dla którego pytam, jest to, że Node.js na ubuntu nie ma funkcji fs.exists(). Chociaż mogę to nazwać, gdy uruchamiam Node.js na moim Macu, kiedy wdrażam serwer, nie powiedzie się z błędem mówiąc, że funkcja nie istnieje.Jak sprawdzić, czy plik lub katalog istnieje bez użycia fs.ist?

Teraz zdaję sobie sprawę, że niektórzy ludzie uważają to za "anty-wzór", aby sprawdzić, czy plik istnieje, a następnie spróbuj go edytować/otworzyć itp., Ale w moim przypadku nigdy nie usuwam tych plików, ale wciąż musisz sprawdzić, czy istnieją przed napisaniem do nich.

Jak mogę sprawdzić, czy katalog (lub plik) istnieje?

EDIT:

Jest to kod biegnę w pliku o nazwie 'temp jest.':

var fs=require('fs'); 
fs.exists('./temp.js',function(exists){ 
    if(exists){ 
     console.log('yes'); 
    }else{ 
     console.log("no"); 
    } 
}); 

Na moim Mac, to działa dobrze. Na ubuntu pojawia się błąd:

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^TypeError: Object #<Object> has no method 'exists' 
    at Object.<anonymous> (/home/banana/temp.js:2:4) 
    at Module._compile (module.js:441:26) 
    at Object..js (module.js:459:10) 
    at Module.load (module.js:348:32) 
    at Function._load (module.js:308:12) 
    at Array.0 (module.js:479:10) 
    at EventEmitter._tickCallback (node.js:192:41) 

na moim Mac - wersja: v0.13.0-pre na Ubuntu - wersja: v0.6.12

+1

Twoje pytanie jest źle, powinien iść "Dlaczego fs.exists() brakuje?". Czy możesz dodać, jakie wersje NodeJs masz na swoim komputerze i Macu? Jaki błąd dostałeś? Coś takiego jak "istnieje nie jest funkcją"? Czy nie ma innych typowych metod FS w tym obiekcie 'fs'? Jak potrzebujesz 'fs'? –

+0

Używam Ubuntu i twój kod działa dobrze dla mnie. Jest to więc problem na twoim komputerze. Jak zainstalowałeś węzeł? Jaką wersję Node i Ubuntu używasz? –

+2

Jest to prawdopodobnie spowodowane faktem, że w NodeJs 0.6 metoda 'exists()' znajdowała się w module 'path': http://web.archive.org/web/20111230180637/http://nodejs.org/api /path.html –

Odpowiedz

7

It's probably due to the fact that in NodeJs 0.6 the exists() method was located in the path module: http://web.archive.org/web/20111230180637/http://nodejs.org/api/path.htmltry-catch-finally

^^ że odpowiedzi komentarz dlaczego nieprawdaż” t tam. Odpowiem, co możesz z tym zrobić (poza tym, że nie używasz wersji antycznych).

Z fs.exists() documentation:

In particular, checking if a file exists before opening it is an anti-pattern that leaves you vulnerable to race conditions: another process may remove the file between the calls to fs.exists() and fs.open() . Just open the file and handle the error when it's not there.

Można zrobić coś takiego:

fs.open('mypath','r',function(err,fd){ 
    if (err && err.code=='ENOENT') { /* file doesn't exist */ } 
}); 
6

Zaakceptowanych odpowiedź nie bierze pod uwagę, że dokumentacja Moduł FS węzeł zaleca stosowanie fs.stat zastąpić fs.exists (patrz the documentation).

skończyło się dzieje z tym:

function filePathExists(filePath) { 
    return new Promise((resolve, reject) => { 
    fs.stat(filePath, (err, stats) => { 
     if (err && err.code === 'ENOENT') { 
     return resolve(false); 
     } else if (err) { 
     return reject(err); 
     } 
     if (stats.isFile() || stats.isDirectory()) { 
     return resolve(true); 
     } 
    }); 
    }); 
} 

Uwaga ES6 składnia + Obietnice - synchronizacja wersji byłoby to nieco prostsze. Również mój kod sprawdza również, czy w łańcuchu znajduje się katalog i zwraca wartość true, jeśli stat jest z niego zadowolony - może to nie jest to, czego wszyscy chcą.

0

Metody synchronizacji nie mają żadnego sposobu powiadomienia o błędzie. Z wyjątkiem wyjątków! Jak się okazuje, metoda fs.statSync zgłasza wyjątek, gdy plik lub katalog nie istnieje. Utworzenie wersji synchronizacji jest tak proste:

function checkDirectorySync(directory) { 
    try { 
    fs.statSync(directory); 
    } catch(e) {  
    try { 
     fs.mkdirSync(directory); 
    } catch(e) { 
     return e; 
    } 
    } 
} 

I to wszystko. Korzystanie jest tak proste, jak poprzednio:

checkDirectorySync("./logs"); 
//directory created/exists, all good. 

[]'z

Powiązane problemy