fs: ฉันจะค้นหาโฟลเดอร์หลักได้อย่างไร


คำตอบ:


279

ลองสิ่งนี้:

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

หมายเหตุเครื่องหมายสแลชที่จุดเริ่มต้นของพา ธ สัมพัทธ์


25
ฉันพยายามอย่างนั้นโดยไม่โชค แต่เพิ่งทำไปfs.readFile(__dirname + '/../../foo.bar');และมันใช้ได้ผล
แฟนซี

6
ฉันสมมติแล้วที่__dirnameถูก Somthing ชอบมากกว่า'/foo/bar' '/foo/bar/'
Andrew Hare

3
'/' แรกในเส้นทางของคุณ: '/../../foo.bar' เป็นสิ่งสำคัญ ฉันมี '../../foo.bar' ซึ่งเป็นสาเหตุของปัญหา
levibostian

1
ทำไม? โดยทั่วไปทำไม ใครช่วยอธิบายหน่อยได้ไหม
eyurdakul

@eyurdakul ถ้าผมเข้าใจมัน corrently: __dirnameอาจมีลักษณะเช่น/path/to/your/dirถ้าคุณบอกว่า__dirname + ".."มันเป็นเรื่องซึ่งเป็นไดเรกทอรีที่ไม่มีอยู่มากกว่า/path/to/your/dir.. /path/to/yourการเฉือนเป็นสิ่งสำคัญ
joulev

165

ใช้ 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() จะจัดการกับ slashes ชั้นนำ / ต่อท้ายสำหรับคุณและเพียงทำสิ่งที่ถูกต้องและคุณไม่ต้องพยายามจำเมื่อมีการต่อท้าย slashes อยู่และเมื่อพวกเขาไม่


4
คำตอบนี้ด้วยpath.joinวิธีที่ถูกต้องคำตอบที่ได้รับการยอมรับไม่ควรจะปฏิบัติตามก็ยังเป็นต้นเหตุeslintในairbnb-base presetกฎไม่มีเส้นทาง concatโดยเฉพาะอย่างยิ่ง
revelt

โหวตครั้งที่ 100 ฉัน__dirnameเป็นhost/src/folderและฉันต้องการhost/folderและทำงานสำหรับฉันไม่ได้คำตอบสหกรณ์
carkod

8
คุณสามารถก้าวต่อไปอีกขั้นหนึ่งแล้วทำอย่างนั้นpath.join(__dirname, '..', '..', 'foo.bar')
ไม่มีใครเลย

ขอบคุณอเล็กซ์คุณช่วยฉันหลังจากการค้นหา 6 ชั่วโมง
SHOHIL SETHIA

95

ฉันรู้ว่ามันค่อนข้างพิถีพิถัน แต่คำตอบทั้งหมดจนถึงตอนนี้ยังไม่ถูกต้องนัก

จุดของ path.join () คือการกำจัดความต้องการของผู้โทรที่จะรู้ว่าตัวแยกไดเรกทอรีที่จะใช้ (ทำแพลตฟอร์มรหัสไม่เชื่อเรื่องพระเจ้า)

ในทางเทคนิคแล้วคำตอบที่ถูกต้องน่าจะเป็น:

var path = require("path");

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

ฉันจะเพิ่มสิ่งนี้เป็นความคิดเห็นในคำตอบของ Alex Wayne แต่ยังไม่พอตัวแทน!

แก้ไข: ตามข้อสังเกตของผู้ใช้ 1767586


4
'foo.bar "ควรเป็น' foo.bar 'ฉันพยายามแก้ไข แต่ต้องมีตัวอักษรขั้นต่ำ 6 ตัว (กฎโง่ถ้าคุณถามฉันป้องกันเราจากการพิมพ์ผิดขนาดเล็กเช่นนี้)
user1767586

1
ฉันสงสัยว่านี่เป็นคำตอบที่ดีที่สุด คำตอบอื่น ๆ บางคำตอบอาจใช้ได้กับบุคคลที่ระบุในระบบปฏิบัติการที่กำหนด แต่การมีตัวคั่นลำดับชั้นของไฟล์ (เช่นเครื่องหมายทับ) ในคำตอบอื่น ๆ นั้นทำให้ฉันสงสัยว่ามันเป็นสากลอย่างไร เช่นฉันกำลังพยายามเขียนแอพอิเล็กตรอนในลักษณะที่ไม่เชื่อเรื่องพระเจ้าบนแพลตฟอร์มและในขณะที่ฉันยังไม่ได้พิสูจน์อย่างละเอียดถี่ถ้วนฉันคิดว่านี่เป็นวิธีที่ปลอดภัยที่สุด ขอบคุณ
Andrew Willems

สิ่งนี้ไม่จำเป็นจริง ๆ แล้วเนื่องจาก path.join () ใช้ path.normalize () ภายใน (ซึ่งจะแปลงพา ธ ตัวคั่นพา ธ ทั้งหมดเป็นรูปแบบระบบปฏิบัติการปัจจุบัน / ที่ต้องการ) บนพา ธ ที่รวมเข้าผลลัพธ์ก่อนกลับมา แต่ก็ไม่สามารถทำร้ายได้
iono

55

วิธีที่ง่ายที่สุดคือใช้path.resolve:

path.resolve(__dirname, '..', '..');

แน่นอนทางออกที่ถูกต้องในขณะที่คุณไม่จำเป็นต้องแก้ไขโฟลเดอร์โดยการเข้าร่วม../เส้นทาง
João Pimentel Ferreira

@ Yan เรียกว่า '.. ' คืออะไร?
gaurav



11

หากโมดูลอื่นโทรหาคุณและคุณยังต้องการทราบตำแหน่งของไฟล์หลักที่กำลังทำงานอยู่คุณสามารถใช้การแก้ไขโค้ดของ @ Jason:

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

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

ด้วยวิธีนี้คุณจะได้ตำแหน่งของสคริปต์ที่ใช้งานจริง


8

หากคุณไม่แน่ใจว่าผู้ปกครองอยู่ในที่ใดสิ่งนี้จะทำให้คุณได้รับเส้นทาง

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

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


2

ฉันใช้แอพอิเล็กตรอนและฉันสามารถเรียกดูพาเรนต์โฟลเดอร์ได้โดย path.resolve ()

ผู้ปกครอง 1 ระดับ:path.resolve(__dirname, '..') + '/'

ผู้ปกครอง 2 ระดับ:path.resolve(__dirname, '..', '..') + '/'


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.