nodejs có được tên tập tin từ đường dẫn tuyệt đối?


289

Nếu có API nào có thể truy xuất tên tệp từ một đường dẫn tệp tuyệt đối?

ví dụ "foo.txt"từ"/var/www/foo.txt"

Tôi biết nó hoạt động với hoạt động chuỗi, fullpath.replace(/.+\//, '') nhưng tôi muốn biết là có một cách 'chính thức' hơn, như file.getName()trong java, có thể làm điều đó.

NodeJS có được tên tập tin từ đường dẫn tuyệt đối?

Câu trả lời:


542

Sử dụng basenamephương pháp của pathmô-đun:

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

Dưới đây là tài liệu ví dụ trên được lấy từ.


108
Nếu bạn cũng muốn xóa tiện ích mở rộng:path.basename(fpath, path.extname(fpath))
Waylon Flinn

33

Để lấy phần tên tệp của tên tệp, phương thức tên cơ sở được sử dụng:

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

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

Nếu bạn muốn tên tệp không có phần mở rộng, bạn có thể chuyển biến phần mở rộng (chứa tên phần mở rộng) cho phương thức tên cơ sở để báo cho Node chỉ trả lại tên mà không có phần mở rộng:

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

Nếu bạn đã biết rằng dấu phân cách đường dẫn /(nghĩa là bạn đang viết cho một nền tảng / môi trường cụ thể), như được ngụ ý trong ví dụ trong câu hỏi của bạn, bạn có thể giữ nó đơn giản và tách chuỗi bằng dấu phân cách:

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

Điều đó sẽ nhanh hơn (và imo sạch hơn) thay vì biểu thức thông thường.

Xin nhắc lại: Chỉ làm điều này nếu bạn đang viết cho một môi trường cụ thể, nếu không thì sử dụng pathmô-đun, vì các đường dẫn phức tạp một cách đáng ngạc nhiên. Windows, ví dụ, hỗ trợ /trong nhiều trường hợp, nhưng không phải ví dụ như \\?\?tiền tố kiểu được sử dụng cho các thư mục mạng chung và tương tự. Trên Windows, phương pháp trên chắc chắn sẽ thất bại, sớm hay muộn.


1
Windows có \ dưới dạng phân tách thư mục
ownageIsMagic

1
@OwnageIsMagic Vâng, đó là lý do tại sao tôi viết chữ Nếu bạn đã biết rằng dấu phân cách đường dẫn là / Lôi ... :)
leo

1
không rõ ý của bạn với tuyên bố này. Điều này tạo ra mã phụ thuộc nền tảng sẽ âm thầm thất bại trên các nền tảng khác
ownageIsMagic

@OwnageIsMagic Vâng, nó thực sự. Luôn sử dụng các phương thức của mô-đun đường dẫn nếu bạn không viết cho một nền tảng cụ thể.
leo

cửa sổ thực sự chấp nhận cả / và \ dưới dạng
ngăn

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

Cung cấp cho bạn tên của tệp mà không cần gia hạn, nếu bạn cần tên có sử dụng mở rộng

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

0

Trong NodeJS, __filename.split (/ \ | //). Pop () chỉ trả về tên tệp từ đường dẫn tệp tuyệt đối trên bất kỳ nền tảng HĐH nào. Tại sao cần phải quan tâm đến việc ghi nhớ / nhập API trong khi phương pháp regex này cũng cho phép chúng tôi nhớ lại các kỹ năng regex của mình.


1
Hãy giải thích câu trả lời của bạn.
JJ cho Minh bạch và Monica

0

Vì vậy, Nodejs đi kèm với biến toàn cục mặc định được gọi là '__fileName'giữ tệp hiện tại đang được thực thi Lời khuyên của tôi là truyền __fileName cho một dịch vụ từ bất kỳ tệp nào, để việc truy xuất tệp Tên được thực hiện động

Dưới đây, tôi sử dụng chuỗi fileName và sau đó phân tách dựa trên path.sep. Lưu ý path.sep tránh các vấn đề với bộ tách tập tin posix và bộ tách tập tin windows (các vấn đề với '/' và '\'). Nó sạch hơn nhiều. Lấy chuỗi con và chỉ nhận được tên tách biệt cuối cùng và trừ nó với độ dài bằng 3 sẽ nói lên điều đó.

Bạn có thể viết một dịch vụ như thế này (Lưu ý đây là bản in, nhưng bạn rất có thể viết nó trong 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();
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.