Node.js - lấy tên tệp hiện tại


Câu trả lời:


231

Node.js cung cấp một API tiêu chuẩn để làm như vậy: Đường dẫn .

Sau đó, lấy tên của tập lệnh hiện tại thật dễ dàng:

var path = require('path');
var scriptName = path.basename(__filename);

Điều này không nhận được tên cơ sở thay vì tên tệp thực sự?
Phil

10
cho một tập lệnh có tên script.js, bạn sẽ nhận được script.js. Nếu bạn chỉ muốn có tên mà không có phần mở rộng, vì chúng tôi đang nói ở đây về một jstập lệnh mà bạn có thể sử dụng var scriptName = path.basename(__filename, '.js');hoặcvar scriptName = path.basename(__filename, path.extname(__filename))
herve

6
một cách khác để bỏ tiện ích mở rộng:path.parse(__filename).name
RH Becker

__filenamekhông được định nghĩa trong Mô-đun ES6.
Cullub

1
@Cullub, trích xuất từ tài liệu nodejs : Các CommonJSbiến này không có sẵn trong mô-đun ES. Tương đương của __filename__dirnamecó thể được tạo bên trong mỗi tệp thông qua import.meta.url.
herve

46

trong một mô-đun, bạn có thể thực hiện bất kỳ thao tác nào sau đây để nhận đường dẫn đầy đủ với tên tệp

this.filename;
module.filename;
__filename;

Nếu bạn chỉ muốn tên thực không có đường dẫn hoặc phần mở rộng, bạn có thể làm như thế này.

module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);

4
Bạn có thể muốn sử dụng path.sep để làm cho nó đa nền tảng. Đây là những gì tôi đã làm __filename.slice (__ filename.lastIndexOf (path.sep) +1);
Ryan

2
Đối với những người chỉ muốn sao chép và dán siêu tiện dụng one-liner, đừng quên hoặc var path = require('path');trước hoặc thay đổi nó thànhmodule.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
forrestranger

17
-3 giả định độ dài của phần mở rộng, một cái gì đó như thế này có thể hoạt động tốt hơnpath.basename(module.filename, path.extname(module.filename))
dre

32

Để chỉ lấy tên tệp. Không có mô-đun bổ sung chỉ đơn giản:

// abc.js
console.log(__filename.slice(__dirname.length + 1));

 // abc
console.log(__filename.slice(__dirname.length + 1, -3));

Đây là những gì tôi đến đây để làm. Cảm ơn!
leviathanbadger

1
Đây phải là câu trả lời được chấp nhận. Hoạt động ở chế độ nghiêm ngặt. Rất thẳng thắn. Cảm ơn bạn!
Matthew

3
Trừ khi phần mở rộng của bạn không dài 2 ký tự, điều này hoàn toàn có thể xảy ra vì bạn có thể ràng buộc phần diễn giải tập lệnh với bất kỳ phần mở rộng tệp nào bạn muốn ... vì vậy đây có thể không phải là một giải pháp toàn diện.
ErikE

24
'use strict';

const scriptName = __filename.split(/[\\/]/).pop();

Giải trình

console.log(__filename);
// 'F:\__Storage__\Workspace\StackOverflow\yourScript.js'
const parts = __filename.split(/[\\/]/);
console.log(parts);
/*
 * [ 'F:',
 *   '__Storage__',
 *   'Workspace',
 *   'StackOverflow',
 *   'yourScript.js' ]
 *
**/

Ở đây chúng tôi sử dụng hàm phân tách với biểu thức chính quy làm tham số đầu tiên.
Biểu thức chính quy mà chúng tôi muốn cho dấu phân tách là [\/](chia bởi /hoặc \) nhưng /ký hiệu phải được thoát ra để phân biệt với dấu chấm dứt regex /, vì vậy /[\\/]/.

const scriptName = __filename.split(/[\\/]/).pop(); // Remove the last array element
console.log(scriptName);
// 'yourScript.js'

Không sử dụng cái này

path.basenameThay vào đó, bạn thực sự nên sử dụng (được tài liệu lần đầu tiên trong Node.js v0.1.25 ), vì nó xử lý tất cả các trường hợp góc mà bạn không muốn biết như tên tệp có dấu gạch chéo bên trong (ví dụ: tệp có tên "foo \ bar" trên unix). Xem pathcâu trả lời ở trên .


Vui lòng thêm lời giải thích
Daniel Cheung,

@DanielCheung của bạn đây! Nhưng thực sự tất cả những thứ này đều có thể tìm kiếm được trên Internets, chỉ cần google javascript splitvà bắt đầu.
ilyaigpetrov

3
Tôi đang giúp bạn ... -_- Câu trả lời của bạn đã được bỏ phiếu để xóa. Một câu trả lời không giải thích đủ hoặc chỉ chứa mã sẽ bị xóa.
Daniel Cheung

3

Bạn cũng có thể nhìn vào console-plus . Điều này thêm tên tệp và số vải vào bất kỳ văn bản ghi nhật ký nào và có các màu khác nhau cho .log, .info và .error.


Tuyệt đấy. Cài đặt bằng "npm install --save console-plus", hoặc nếu bạn đang sử dụng sợi: "fiber add console-plus"
Andrew Faulkner

1

Chà, tôi muốn sử dụng tên tệp làm thẻ cho trình ghi nhật ký, vì vậy, ngay từ đầu và điều tôi muốn là:

__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))

1

Tôi biết đã lâu rồi, nhưng những gì tôi đã làm là như vậy __filename.split('\\').pop(). Thao tác này sẽ nhận được đường dẫn đầy đủ với tên tệp, chia nhỏ nó \sau đó lấy chỉ mục cuối cùng sẽ là tên tệp của bạn.


1
Trên hệ điều hành MacOS__filename.split('/').pop()
Reece Daniels

1

bạn có thể sử dụng chức năng này để lấy tên tệp:

/**
 * @description 
 * get file name from path
 * @param {string} path path to get file name
 * @returns {string} file name
 * @example 
 * getFileName('getFileName/index.js') // => index.js
 */
export default function getFileName(path) {
    return path.replace(/^.*[\\\/]/, '');
}

nếu bạn sử dụng nodejs, bạn có thể cài đặt gói bao gồm chức năng này https://www.npmjs.com/package/jotils

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.