fs: làm thế nào để tôi xác định vị trí thư mục cha mẹ?


193

Làm thế nào để tôi viết cái này để quay lại 2 cấp độ cha mẹ để tìm một tập tin?

fs.readFile(__dirname + 'foo.bar');

Câu trả lời:


277

Thử cái này:

fs.readFile(__dirname + '/../../foo.bar');

Lưu ý dấu gạch chéo phía trước ở đầu đường dẫn tương đối.


25
Tôi đã cố gắng mà không có may mắn nhưng tôi đã làm fs.readFile(__dirname + '/../../foo.bar');và nó đã làm việc.
ưa thích

6
Tôi đang giả định rằng đó là một cái gì đó __dirnamethích '/foo/bar'hơn là '/foo/bar/'.
Andrew Hare

3
Đầu tiên '/' trong đường dẫn của bạn: '/../../foo.bar' là rất quan trọng. Tôi đã có '../../foo.bar' gây ra sự cố của tôi.
levibostian

1
tại sao? nói chung là tại sao? ai đó có thể vui lòng giải thích?
Eyurdakul

@eyurdakul Nếu tôi hiểu nó một cách chính xác: __dirnamecó thể trông như thế /path/to/your/dir, nếu bạn nói __dirname + ".."nó là /path/to/your/dir.., đó là một thư mục không tồn tại, chứ không phải là /path/to/your. Dấu gạch chéo là quan trọng.
JouleV có mặt tại topanswers.xyz

161

Sử dụng path.join http://nodejs.org/docs/v0.4.10/api/path.html#path.join

var path = require("path"),
    fs = require("fs");

fs.readFile(path.join(__dirname, '..', '..', 'foo.bar'));

path.join() sẽ xử lý các dấu gạch chéo hàng đầu / dấu vết cho bạn và chỉ cần thực hiện đúng và bạn không phải cố gắng nhớ khi nào dấu gạch chéo tồn tại và khi nào thì không.


4
Câu trả lời này có path.joinlà cách chính xác, câu trả lời được chấp nhận không nên đi theo, nó thậm chí còn gây nên eslinttrên airbnb-base preset, các quy tắc không-đường-concat đặc biệt
revelt

Upvote thứ 100. Tôi __dirnameđã host/src/foldervà tôi cần host/foldervà điều này làm việc cho tôi, không phải câu trả lời của OP.
carkod

8
bạn có thể tiến thêm một bước và làmpath.join(__dirname, '..', '..', 'foo.bar')
Ông Nobody

Cảm ơn Alex, bạn đã cứu tôi sau 6 giờ tìm kiếm,
SHOHIL SETHIA

95

Tôi biết nó hơi kén chọn, nhưng tất cả các câu trả lời cho đến nay không hoàn toàn đúng.

Điểm của path.join () là loại bỏ sự cần thiết của người gọi để biết nên sử dụng trình phân tách thư mục nào (làm cho nền tảng mã hóa bất khả tri).

Về mặt kỹ thuật, câu trả lời đúng sẽ là một cái gì đó như:

var path = require("path");

fs.readFile(path.join(__dirname, '..', '..', 'foo.bar'));

Tôi đã có thể thêm điều này như một nhận xét cho câu trả lời của Alex Wayne nhưng chưa đủ đại diện!

EDIT: theo quan sát của người dùng1767586


4
'foo.bar" nên được 'foo.bar' Tôi đã cố gắng để làm cho một chỉnh sửa nhưng sửa đổi cần phải được tối thiểu 6 ký tự (quy tắc ngớ ngẩn nếu bạn hỏi tôi, ngăn ngừa chúng ta khỏi chỉnh sửa lỗi chính tả nhỏ như thế này)..
user1767586

1
Tôi nghi ngờ rằng đây là câu trả lời tốt nhất. Một số câu trả lời khác có thể hoạt động cho một cá nhân nhất định trên một hệ điều hành nhất định, nhưng sự hiện diện của một loại phân cách phân cấp tệp cụ thể (nghĩa là dấu gạch chéo) trong các câu trả lời khác đó khiến tôi tự hỏi mức độ phổ biến của chúng. ví dụ: tôi đang cố gắng viết một ứng dụng Electron theo cách bất khả tri của nền tảng và, trong khi tôi chưa chứng minh được hết, tôi nghi ngờ đây là cách an toàn nhất. Cảm ơn.
Andrew Willems

Điều này thực sự không cần thiết, vì path.join () sử dụng bên trong path.n normalize () (biến đổi tất cả các dấu tách đường dẫn thành định dạng HĐH hiện tại / dự định) trên đường dẫn kết quả trước khi quay lại. Nó không thể làm tổn thương, mặc dù.
iono


12

Có vẻ như bạn sẽ cần pathmô-đun. ( path.normalizeđặc biệt)

var path = require("path"),
    fs = require("fs");

fs.readFile(path.normalize(__dirname + "/../../foo.bar"));

11

Nếu một mô-đun khác gọi cho bạn và bạn vẫn muốn biết vị trí của tệp chính đang chạy, bạn có thể sử dụng sửa đổi mã của @ Jason:

var path = require('path'),
    __parentDir = path.dirname(process.mainModule.filename);

fs.readFile(__parentDir + '/foo.bar');

Bằng cách đó, bạn sẽ có được vị trí của tập lệnh thực sự đang được chạy.


8

Nếu bạn không tích cực về nơi cha mẹ đang ở, điều này sẽ giúp bạn có con đường;

var path = require('path'),
    __parentDir = path.dirname(module.parent.filename);

fs.readFile(__parentDir + '/foo.bar');


2

Tôi đang chạy ứng dụng điện tử và tôi có thể lấy thư mục mẹ bằng path.resolve ()

phụ huynh 1 cấp:path.resolve(__dirname, '..') + '/'

cha mẹ 2 cấp:path.resolve(__dirname, '..', '..') + '/'


1

điều này cũng sẽ làm việc:

fs.readFile(`${__dirname}/../../foo.bar`);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.