2014-12-14 10 views
5

Lý do tôi hỏi, là vì Node.js trên ubuntu dường như không có hàm fs.exists(). Mặc dù tôi có thể gọi điều này khi tôi chạy Node.js trên máy Mac của mình, khi tôi triển khai đến máy chủ, nó không thành công với một lỗi nói rằng hàm này không tồn tại.Làm cách nào để kiểm tra xem tệp hoặc thư mục có tồn tại mà không sử dụng fs.exists không?

Bây giờ, tôi biết rằng một số người coi đó là "chống mẫu" để kiểm tra xem tệp có tồn tại không và sau đó thử và chỉnh sửa/mở tệp, v.v. cần phải kiểm tra xem chúng có tồn tại trước khi viết cho chúng hay không.

Vậy làm cách nào để kiểm tra xem thư mục (hoặc tệp) có tồn tại không?

EDIT:

Đây là mã tôi chạy trong một tập tin gọi là 'tạm thời của.':

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

Trên Mac của tôi, nó hoạt động tốt. Trên ubuntu tôi nhận được lỗi:

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) 

trên máy Mac của tôi - phiên bản: v0.13.0-pre trên Ubuntu - phiên bản: v0.6.12

+1

Câu hỏi của bạn là sai, nó phải đi "Tại sao fs.exists() mất tích?". Bạn có thể vui lòng thêm các phiên bản NodeJs bạn có trên PC và máy Mac của mình không? lỗi gì bạn nhận được? Một cái gì đó như "tồn tại không phải là một chức năng"? Các phương thức FS điển hình khác có thiếu đối tượng 'fs' đó không? Làm thế nào để bạn yêu cầu 'fs'? –

+0

Tôi đang chạy Ubuntu và mã của bạn hoạt động tốt cho tôi. Vì vậy, đó là một vấn đề trên máy cụ thể của bạn. Bạn đã cài đặt nút như thế nào? Bạn đang chạy phiên bản Node và Ubuntu nào? –

+2

Có thể là do NodeJs 0.6 phương thức 'exist()' được đặt trong mô-đun 'đường dẫn': http://web.archive.org/web/20111230180637/http://nodejs.org/api /path.html –

Trả lời

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

^^ Đó là lời nhận xét câu trả lời tại sao nó isn' t ở đó. Tôi sẽ trả lời những gì bạn có thể làm về nó (ngoài việc không sử dụng các phiên bản cũ).

Từ 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.

Bạn có thể làm một cái gì đó như thế này:

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

Câu trả lời được chấp nhận không đưa vào tài khoản rằng các tài liệu nút mô-đun fs khuyến cáo sử dụng để thay thế fs.stat fs.exists (xem the documentation).

tôi đã kết thúc đi với điều này:

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); 
     } 
    }); 
    }); 
} 

Note ES6 cú pháp + Promises - phiên bản đồng bộ này sẽ là một chút đơn giản hơn. Ngoài ra mã của tôi cũng kiểm tra để xem nếu có một thư mục hiện diện trong chuỗi đường dẫn và trả về true nếu stat là hạnh phúc với nó - điều này có thể không phải là những gì mọi người muốn.

0

Phương thức đồng bộ hóa không có bất kỳ cách nào để thông báo về lỗi. Ngoại trừ trường hợp ngoại lệ! Khi nó quay ra, phương thức fs.statSync ném một ngoại lệ khi tệp hoặc thư mục không tồn tại. Tạo phiên bản đồng bộ hóa dễ dàng như vậy:

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

Và đó là nó. Sử dụng cũng đơn giản như trước đây:

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

[]'z

Các vấn đề liên quan