nodejs ได้รับชื่อไฟล์จากเส้นทางที่แน่นอน?


289

หากมี API ใดสามารถเรียกชื่อไฟล์จากพา ธ ไฟล์ที่แน่นอนได้

เช่น"foo.txt"จาก"/var/www/foo.txt"

ฉันรู้ว่ามันใช้งานได้กับการดำเนินการของสตริงเช่นfullpath.replace(/.+\//, '') แต่ฉันต้องการที่จะรู้ว่ามีวิธี 'ทางการ' มากขึ้นเช่นfile.getName()ใน java สามารถทำได้

NodeJS รับชื่อไฟล์จากเส้นทางที่แน่นอน?

คำตอบ:


542

ใช้basenameวิธีการของpathโมดูล:

path.basename('/foo/bar/baz/asdf/quux.html')
// returns
'quux.html'

นี่คือเอกสารตัวอย่างข้างต้นนำมาจาก


108
หากคุณต้องการลบส่วนขยาย:path.basename(fpath, path.extname(fpath))
Waylon Flinn

33

ในการรับส่วนชื่อไฟล์ของชื่อไฟล์จะใช้เมธอด basename:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var file = path.basename(fileName);

console.log(file); // 'python.exe'

หากคุณต้องการชื่อไฟล์ที่ไม่มีส่วนขยายคุณสามารถส่งตัวแปรส่วนขยาย (ที่มีชื่อส่วนขยาย) ไปยังเมธอด basename โดยบอกให้โหนดคืนค่าชื่อที่ไม่มีนามสกุลเท่านั้น:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var extension = path.extname(fileName);
var file = path.basename(fileName,extension);

console.log(file); // 'python'


4

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

'/foo/bar/baz/asdf/quux.html'.split('/').pop()

นั่นจะเร็วกว่า (และสะอาดกว่า imo) มากกว่าการแทนที่ด้วยนิพจน์ทั่วไป

อีกครั้ง: ทำเช่นนี้เฉพาะในกรณีที่คุณกำลังเขียนสำหรับสภาพแวดล้อมที่เฉพาะเจาะจงมิฉะนั้นใช้pathโมดูลเนื่องจากเส้นทางนั้นซับซ้อนอย่างน่าประหลาดใจ ยกตัวอย่างเช่น Windows รองรับ/ในหลายกรณี แต่ไม่ใช่สำหรับเช่น\\?\?คำนำหน้าสไตล์ที่ใช้สำหรับโฟลเดอร์เครือข่ายที่ใช้ร่วมกันและไม่ชอบ ใน Windows วิธีการข้างต้นจะถึงวาระที่จะล้มเหลวไม่ช้าก็เร็ว


1
Windows มีตัวแยกโฟลเดอร์ \ as
OwnageIsMagic

1
@OwnageIsMagic ใช่ว่าเป็นเหตุผลที่ผมเขียน“ถ้าคุณรู้อยู่แล้วว่าตัวคั่นเส้นทาง /” ... :)
สิงห์

1
ยังไม่ชัดเจนว่าคุณหมายถึงอะไรกับข้อความนี้ สิ่งนี้สร้างโค้ดที่ขึ้นกับแพลตฟอร์มซึ่งจะล้มเหลวในแพลตฟอร์มอื่น ๆ อย่างเงียบ ๆ
OwnageIsMagic

@OwnageIsMagic ใช่มันทำแน่นอน ใช้วิธีการของโมดูลเส้นทางทุกครั้งถ้าคุณไม่ได้เขียนสำหรับแพลตฟอร์มเฉพาะ
สิงห์

จริง ๆ แล้ว windows ยอมรับทั้ง / และ \ เป็นตัวคั่นโฟลเดอร์และคุณสามารถรวมมันได้ด้วย
RozzA

3
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;

ให้ชื่อไฟล์ที่ไม่มีนามสกุลหากคุณต้องการชื่อที่มีการใช้ส่วนขยาย

var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.basename(filepath);

0

ใน NodeJS, __filename.split (/ \ | //). pop () จะส่งคืนชื่อไฟล์จากพา ธ ไฟล์ที่แน่นอนบนแพลตฟอร์ม OS ใด ๆ เหตุใดจึงต้องใส่ใจเกี่ยวกับการจดจำ / นำเข้า API ในขณะที่วิธีการ regex นี้ยังช่วยให้เราจำทักษะ regex ของเรา


1
โปรดอธิบายคำตอบของคุณให้ละเอียด
JJ เพื่อความโปร่งใสและโมนิก้า

0

ดังนั้น Nodejs มาพร้อมกับตัวแปรโกลบอลเริ่มต้นที่เรียกว่า '__fileName'ที่เก็บไฟล์ปัจจุบันที่ถูกดำเนินการคำแนะนำของฉันคือการส่ง __fileName ไปยังบริการจากไฟล์ใด ๆ เพื่อให้การดึงชื่อไฟล์เป็นแบบไดนามิก

path.sepด้านล่างนี้ฉันจะทำให้การใช้งานของสตริงชื่อไฟล์แล้วแยกบนพื้นฐานของ Note path.sep หลีกเลี่ยงปัญหาเกี่ยวกับตัวคั่นไฟล์ posix และตัวคั่นไฟล์ windows (ปัญหาเกี่ยวกับ '/' และ '\') มันสะอาดกว่ามาก การรับสตริงย่อยและรับเฉพาะชื่อที่แยกล่าสุดและลบออกด้วยความยาว actulal ด้วย 3 พูดสำหรับตัวเอง

คุณสามารถเขียนบริการเช่นนี้ได้ (โปรดทราบว่านี่เป็นตัวพิมพ์ดีด แต่คุณสามารถเขียนได้เป็น js)

export class AppLoggingConstants {

    constructor(){

    }
      // Here make sure the fileName param is actually '__fileName'
    getDefaultMedata(fileName: string, methodName: string) {
        const appName = APP_NAME;
        const actualFileName = fileName.substring(fileName.lastIndexOf(path.sep)+1, fileName.length - 3);
        //const actualFileName = fileName;
     return appName+ ' -- '+actualFileName;
    }


}

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