Node.js - ค้นหาโฮมไดเร็กตอรี่ด้วยวิธีที่ไม่เชื่อเรื่องพระเจ้าบนแพลตฟอร์ม


215

Process.platform ส่งคืน "win32" สำหรับ Windows ใน Windows ไดเรกทอรีบ้านของผู้ใช้อาจเป็น C: \ Users [USERNAME] หรือ C: \ Documents and Settings [USERNAME] ขึ้นอยู่กับเวอร์ชันของ Windows ที่กำลังใช้งานอยู่ ใน Unix นี่ไม่ใช่ปัญหา


Mac OS X เก็บรักษาวิธี Unix ไว้หรือไม่หรือต้องการสิ่งที่แตกต่างด้วย
hippietrail

2
@hippietrail Mac OS X ใช้ HOME เหมือนกับ Unix อื่น ๆ
Marnen Laibow-Koser

คำตอบ:


331

ดังที่ได้กล่าวไว้ในคำตอบล่าสุดวิธีที่ต้องการคือ:

const homedir = require('os').homedir();

[คำตอบดั้งเดิม] : ทำไมไม่ใช้USERPROFILEตัวแปรสภาพแวดล้อมใน win32

function getUserHome() {
  return process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'];
}

ขอบคุณ. เพิ่งติดตั้ง Node.js ในพื้นที่เนื่องจากการสร้างเซิร์ฟเวอร์พื้นฐานบน Cloud9 ไม่ได้ติดตามการสอนเล็ก ๆ ของฉัน (แน่นอน) ... และไม่มีความคิดใดที่จะวางไฟล์ของฉัน คุณเป็นผู้ชาย! (ฉันถือว่า)
Steve

ใน 0.10.33 ชนะ 64 บิตสิ่งนี้ไม่ทำงาน ฉันมี USERPROFILE และ HOME ตั้งไว้ที่ C: บริษัท ของฉันบังคับให้ฉันต้องมี HOMEDRIVE / HOMEPATH ตั้งค่าเครือข่ายแชร์ H: ด้วยเหตุผลบางอย่างที่ชอบมากกว่า H:
Angus

9
ฉันมีปฏิกิริยาตอบสนองเชิงลบต่อคำตอบนี้และคำตอบยอดนิยมอันดับสอง หากคุณกำลังใช้ node.js ดังนั้น IMHO คุณควรใช้โมดูล npm เช่น os.homedir () และ osenv.home () (ทั้งคู่กล่าวถึงด้านล่าง) หากคุณดูที่แหล่งข้อมูลสำหรับ os.homedir () คุณจะเห็นว่าไม่ใช่เรื่องง่าย
Larry Maccherone

นี่ไม่ใช่วิธีที่ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์ม
Michael

การตัด a path.resolve()อาจให้การฟื้นฟูในแง่ของ slashes ต่อท้าย, อาจไปข้างหน้า / backslashes แปลก ๆ , ฯลฯ ... (โดยเฉพาะอย่างยิ่งถ้าคุณมีการดำเนินงานไฟล์ในใจ, หลังจากได้รับข้อมูลนี้)
Frank Nocke

237

os.homedir()ถูกเพิ่มโดย PR นี้และเป็นส่วนหนึ่งของการเผยแพร่ nodejs สาธารณะ 4.0.0


ตัวอย่างการใช้งาน:

const os = require('os');

console.log(os.homedir());

ยินดีต้อนรับสู่ Stack Overflow! โปรดตรวจสอบให้แน่ใจว่าวลีคำตอบของคุณเป็นคำตอบไม่ใช่คำถาม
durron597

2
เข้าใจแล้ว เพิ่มแหล่งข้อมูลเพราะos.homedir()เป็นของเล่นใหม่ที่น่ากลัว
Cody Allan Taylor

8
ควรยอมรับคำตอบเนื่องจากเป็นแพลตฟอร์มข้ามที่เข้ากันได้
Yahya Uddin

2
คุณต้องเพิ่มconst os = require('os');ด้วย
Roel

81

มันจะมีความแม่นยำมากกว่าในการใช้คุณสมบัติไม่ใช่ค่าตัวแปร โดยเฉพาะอย่างยิ่งเนื่องจากมี 2 ตัวแปรที่เป็นไปได้สำหรับ Windows

function getUserHome() {
  return process.env.HOME || process.env.USERPROFILE;
}

แก้ไข : ดังที่ได้กล่าวไว้ในคำตอบล่าสุดhttps://stackoverflow.com/a/32556337/103396เป็นวิธีที่เหมาะสมในการไป ( require('os').homedir())


1
บนเครื่อง Windows 7 ของฉัน HOMEPATH และ USERPROFILE จะส่งคืนสิ่งเดียวกัน (C: \\ Users \\ ชื่อผู้ใช้) HOME ส่งคืนไม่ได้กำหนด บน Mac HOME ของฉันคืนค่า / ผู้ใช้ / ชื่อผู้ใช้และ HOMEPATH และ USERPROFILE ส่งคืนไม่ได้กำหนด
Ben Clayton

1
บนหน้าต่างของฉัน 7 เครื่อง, ผลตอบแทน HOMEPATH \users\nameและ USERPROFILE c:\users\nameมี ดังนั้นวิธีนี้จึงไม่แม่นยำและแข็งแกร่งเท่ากับ @maerics '
PA


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