ความแตกต่างระหว่าง path.normalize และ path.resolve ใน Node.js


86

อะไรคือความแตกต่าง (ถ้ามี) ระหว่างpath.normalize(your_path)และpath.resolve(your_path)?

ฉันรู้ว่าpath.resolve(...)สามารถยอมรับหลายอาร์กิวเมนต์ได้ แต่พฤติกรรมของอาร์กิวเมนต์เดียวเหมือนกับการโทรpath.normalize()หรือไม่

แก้ไข:หากพวกเขาควรจะทำงานในลักษณะเดียวกันฉันไม่เข้าใจจุดประสงค์ของการเปิดเผยpath.normalize(...)ฟังก์ชันเมื่อคุณสามารถส่งเส้นทางไปยังpath.resolve(...)หรืออาจเป็นไปเพื่อวัตถุประสงค์ในการจัดทำเอกสาร ตัวอย่างเช่นพวกเขากล่าวในเอกสารสำหรับpath.resolve(...):

... เส้นทางผลลัพธ์จะถูกทำให้เป็นปกติและ ...

การเปิดเผยpath.normalize(...)ทำให้ง่ายต่อการอธิบายว่า "normalized" หมายถึงอะไร ??? ฉันไม่รู้.

คำตอบ:


183

path.normalizeได้รับกำจัดของพิเศษ., ..ฯลฯ ในเส้นทาง path.resolveแก้ไขเส้นทางเป็นเส้นทางสัมบูรณ์ ตัวอย่าง (ไดเร็กทอรีการทำงานปัจจุบันของฉันคือ/Users/mtilley/src/testing):

> path.normalize('../../src/../src/node')
'../../src/node'
> path.resolve('../../src/../src/node')
'/Users/mtilley/src/node'

กล่าวอีกนัยหนึ่งpath.normalizeคือ "เส้นทางที่สั้นที่สุดที่ฉันสามารถทำได้คืออะไรซึ่งจะพาฉันไปยังสถานที่เดียวกันกับอินพุต" ในขณะที่path.resolveคือ "ปลายทางของฉันคืออะไรถ้าฉันใช้เส้นทางนี้"

หมายเหตุ แต่ที่path.normalize()เป็นมากpath.resolve()มากขึ้นบริบทอิสระกว่า ได้path.normalize()รับบริบทเดอจี้ (คือถ้ามันได้นำมาพิจารณาไดเรกทอรีการทำงานปัจจุบัน) ผลในตัวอย่างข้างต้นจะได้รับนั้น../nodeเนื่องจากว่าเป็นหนึ่งในเส้นทางที่สั้นที่สุดอาจจะใช้เวลาจากไป/Users/mtilley/src/testing/Users/mtilley/src/node

แดกดันนั่นหมายความว่าpath.resolve()สร้างเส้นทางสัมพัทธ์ในรูปแบบสัมบูรณ์ (คุณสามารถดำเนินการได้ทุกที่และจะให้ผลลัพธ์เดียวกัน) ในขณะที่path.normalize()สร้างเส้นทางสัมบูรณ์ในรูปแบบสัมพัทธ์ (คุณต้องดำเนินการในเส้นทางที่สัมพันธ์กับที่คุณต้องการ คำนวณผลลัพธ์ที่แน่นอน)


ดี. ขอบคุณสำหรับคำตอบ! นี่เป็นปัญหาของฉันมาระยะหนึ่งแล้ว เอกสาร Node แม้ว่าโดยทั่วไปแล้วจะค่อนข้างดี แต่ก็ทำให้ฉันงงงวยเล็กน้อยกับเอกสารนี้
BMiner

14
โปรดทราบว่า path.normalize สามารถจัดการพา ธ ใด ๆ ที่คุณอาจต้องการทำให้เป็นมาตรฐานและหมายถึงการจัดการสตริงของพา ธ เท่านั้นในขณะที่ path.resolve จะใช้ระบบไฟล์และไดเร็กทอรีปัจจุบันเพื่อแก้ไขพา ธ ไปยังพา ธ สัมบูรณ์ สิ่งนี้ทำให้พฤติกรรมแตกต่างกันมากเนื่องจาก path.normalize อาจถูกใช้บนเส้นทางภายในไฟล์ tar บนระบบไฟล์ระยะไกลหรือสิ่งที่เป็นนามธรรมโดยสิ้นเชิง
เปลือย

ต่างจาก path.join อย่างไร?
Vijey

2

จากเอกสาร:

อีกวิธีหนึ่งในการคิดถึงการแก้ไขคือลำดับของคำสั่ง cd ในเชลล์

ลิงก์ไปยังpath.resolveและpath.normalizeในเอกสารประกอบ ส่วนใหญ่ฉันไม่ต้องการเพียงแค่ให้ลิงค์ในคำตอบ แต่เอกสาร Node.js นั้นดีมาก


ฉันเดาว่าฉันไม่เข้าใจจุดประสงค์ของการเปิดเผยฟังก์ชัน normalize (... ) เมื่อคุณสามารถผ่านเส้นทางไปยัง path.resolve (... )
BMiner

6
เส้นทางที่คุณกำลังทำให้เป็นมาตรฐานอาจไม่มีอยู่จริงในระบบไฟล์เช่นคุณอาจทำให้เส้นทางไปยังไฟล์ที่คุณกำลังจะสร้างเป็นปกติหรือคุณอาจจะทำให้เส้นทาง URL สัมพันธ์เป็นปกติ
lanzz

อันที่จริงฉันไม่รู้ว่าทำไมคุณถึงใช้ normalize ในการแก้ปัญหาด้วย
Pickels

1
normalize ไม่ทำให้เส้นทางไปสู่เส้นทางสัมบูรณ์ ดังนั้นจึงสามารถใช้เพื่อรับเส้นทางที่มีเหตุผลสำหรับทรัพยากรบางแหล่งที่สัมพันธ์กับแหล่งข้อมูลอื่นซึ่งสามารถใช้ภายใน HTML เพื่ออ้างอิงไฟล์ที่ผู้ใช้เลือกเช่น เนื่องจากเส้นทางที่ทำให้เป็นมาตรฐานนั้นเรียบง่ายเสมอ (ไม่มีพิเศษ../) จึงสามารถตรวจสอบได้อย่างง่ายดายเพื่อให้แน่ใจว่าผู้ใช้เลือกไฟล์จากบางตำแหน่งเท่านั้นและไม่มีโอกาสดูไฟล์ส่วนตัวนอกสถานที่นี้
dronus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.