nodejs obtém o nome do arquivo do caminho absoluto?

289

Se alguma API puder recuperar o nome do arquivo de um caminho absoluto?

por exemplo, "foo.txt"de"/var/www/foo.txt"

Eu sei que funciona com operação de string, como, fullpath.replace(/.+\//, '') mas eu quero saber se existe uma maneira mais 'formal', como file.getName()em java, poderia fazê-lo.

NodeJS obtém o nome do arquivo do caminho absoluto?

fxp
fonte

Respostas:

542

Use o basenamemétodo do pathmódulo:

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

Aqui está a documentação da qual o exemplo acima foi retirado.

Victor Stanciu
fonte
108
Se você também deseja remover a extensão:path.basename(fpath, path.extname(fpath))
Waylon Flinn
33

Para obter a parte do nome do arquivo, o método basename é usado:

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

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

Se você desejar o nome do arquivo sem a extensão, poderá passar a variável da extensão (contendo o nome da extensão) para o método basename, dizendo ao Node para retornar apenas o nome sem a extensão:

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'
Rubin bhandari
fonte
4

Se você já sabe que o separador de caminho é /(ou seja, você está escrevendo para uma plataforma / ambiente específico), como está implícito no exemplo da sua pergunta, você pode mantê-lo simples e dividir a string pelo separador:

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

Isso seria mais rápido (e limpo) do que substituir pela expressão regular.

Novamente: Faça isso apenas se estiver escrevendo para um ambiente específico; caso contrário, use o pathmódulo, pois os caminhos são surpreendentemente complexos. O Windows, por exemplo, suporta /em muitos casos, mas não, por exemplo, os \\?\?prefixos de estilo usados ​​para pastas de rede compartilhadas e similares. No Windows, o método acima está fadado ao fracasso, mais cedo ou mais tarde.

leo
fonte
1
O Windows tem \ como separador de pastas
OwnageIsMagic
1
@OwnageIsMagic Sim, é por isso que eu escrevo “Se você já sabe que o separador de caminho é /” ... :)
leo
1
não está claro o que você quis dizer com esta afirmação. Isso produz código dependente da plataforma que silenciosamente falhará em outras plataformas
OwnageIsMagic
@OwnageIsMagic Sim, de fato. Sempre use os métodos do módulo de caminho se você não estiver escrevendo para uma plataforma específica.
Leo
janelas, na verdade aceita ambos / e \ como separadores de pasta e você pode até misturar-se
ROZZA
3
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;

Fornece o nome do arquivo sem extensão, se você precisar do nome com extensão, use

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

No NodeJS, __filename.split (/ \ | //). Pop () retorna apenas o nome do arquivo do caminho absoluto do arquivo em qualquer plataforma do sistema operacional. Por que precisamos nos preocupar em lembrar / importar uma API enquanto essa abordagem de regex também nos permite relembrar nossas habilidades em regex?

Visv M
fonte
1
Por favor, elabore sua resposta.
JJ for Transparency e Monica
0

Portanto, o Nodejs vem com a variável global padrão chamada '__fileName' que mantém o arquivo atual sendo executado. Meu conselho é passar o __fileName para um serviço a partir de qualquer arquivo, para que a recuperação do fileName seja dinâmica.

Abaixo, utilizo a string fileName e a divido com base no path.sep . Observe que path.sep evita problemas com os separadores de arquivos posix e Windows (se houver '/' e '\'). É muito mais limpo. Obter a substring e obter apenas o último nome separado e subtraí-lo com o comprimento atuarial por 3 fala por si.

Você pode escrever um serviço como este (observe que está em texto datilografado, mas pode muito bem escrever em 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();
Joey587
fonte