nodejs dosya adını mutlak yoldan alıyor mu?


289

Herhangi bir API dosya adını mutlak dosya yolundan alabilirse?

örneğin "foo.txt"dan"/var/www/foo.txt"

Dize işlemi ile çalıştığını biliyorum, fullpath.replace(/.+\//, '') ama bilmek istiyorum file.getName(), java gibi, daha 'resmi' bir yolu var , bunu yapabilir.

NodeJS mutlak yoldan dosya adı alıyor mu?

Yanıtlar:


542

Modül basenameyöntemini kullanın path:

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

İşte yukarıdaki örnek alınır dokümandır.


108
Uzantıyı da kaldırmak istiyorsanız:path.basename(fpath, path.extname(fpath))
Waylon Flinn

33

Dosya adının dosya adı bölümünü almak için temel ad yöntemi kullanılır:

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

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

Dosya adının uzantısız olmasını istiyorsanız, uzantı değişkenini (uzantı adını içeren) Basename yöntemine ileterek Düğüme yalnızca uzantısız adı döndürmesini söyleyebilirsiniz:

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

Yol ayırıcısının zaten olduğunu biliyorsanız /(yani belirli bir platform / ortam için yazıyorsanız), sorunuzdaki örnekte belirtildiği gibi, basit tutabilir ve dizeyi ayırıcıya bölebilirsiniz:

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

Bu, normal ifade ile değiştirmekten daha hızlı (ve daha temiz imo) olurdu .

Tekrar: Bunu sadece belirli bir ortam için yazıyorsanız yapın, aksi takdirde pathyollar şaşırtıcı derecede karmaşık olduğu için modülü kullanın . Pencereler, örneğin, destekler /birçok durumda ama değil örneğin için \\?\?paylaşılan ağ klasörleri ve benzerleri için kullanılan stil önekleri. Windows'ta yukarıdaki yöntem er ya da geç başarısız olmaya mahkumdur.


1
Windows klasör ayırıcı olarak \ var
OwnageIsMagic

1
@OwnageIsMagic Evet, bu yüzden şöyle yazıyorum: “Yol ayırıcının zaten olduğunu biliyorsanız /” ... :)
leo

1
bu ifade ile ne demek istediğinizi açık değil. Bu, diğer platformlarda sessizce başarısız olacak platforma bağlı kod üretir
OwnageIsMagic 12:18

@OwnageIsMagic Evet, gerçekten de öyle. Belirli bir platform için yazmıyorsanız, daima yol modülünün yöntemlerini kullanın.
leo

Windows aslında hem / ve \ 'yi klasör ayırıcılar olarak kabul eder ve hatta karıştırabilirsiniz
RozzA

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

Genişletme kullanımıyla isme ihtiyacınız varsa, uzantısız dosyanın adını verir

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

0

NodeJS'de __filename.split (/ \ | //). Pop (), herhangi bir işletim sistemi platformundaki mutlak dosya yolundan yalnızca dosya adını döndürür. Bu regex yaklaşımı aynı zamanda regex becerilerimizi hatırlamamıza izin verirken neden bir API'yi hatırlama / içe aktarma konusunda dikkatli olmamız gerekiyor?


1
Lütfen cevabınızı detaylandırın.
JJ for Transparency ve Monica

0

Bu nedenle Nodejs '__fileName', yürürlükteki dosyayı yürüten varsayılan genel değişkenle birlikte gelir . Tavsiyem __fileName öğesini herhangi bir dosyadan bir hizmete aktarmaktır, böylece fileName dosyasının alınması dinamik hale getirilir

Aşağıda, fileName dizesini kullanmak ve sonra dayalı bölmek path.sep. Path.sep, posix dosya ayırıcıları ve windows dosya ayırıcıları ile ilgili sorunları önler ('/' ve '\' ile ilgili sorunlar). Çok daha temiz. Alt dizeyi almak ve sadece son ayrılmış adı almak ve aktüatör uzunluğu ile 3 çıkarmak, kendisi için konuşur.

Böyle bir hizmet yazabilirsiniz (Bu, daktilodadır, ancak js'de çok iyi yazabilirsiniz)

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.