Eu programa em WPF C #. Eu tenho, por exemplo, o seguinte caminho:
C:\Program Files\hello.txt
e eu quero extrair hello
dele.
O caminho é string
recuperado de um banco de dados. Atualmente, estou usando o seguinte código para dividir o caminho '\'
e depois dividir novamente por '.'
:
string path = "C:\\Program Files\\hello.txt";
string[] pathArr = path.Split('\\');
string[] fileArr = pathArr.Last().Split('.');
string fileName = fileArr.Last().ToString();
Funciona, mas acredito que deve haver uma solução mais curta e inteligente para isso. Qualquer ideia?
Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")
está retornando a mesma string e não a convertendo em "file.cs" por algum motivo. Se eu copiar / colar meu código em um compilador online (como rextester.com ), ele funcionará ...?Respostas:
Path.GetFileName
Path.GetFileNameWithoutExtension
A classe Path é maravilhosa.
fonte
experimentar
http://msdn.microsoft.com/de-de/library/system.io.path.getfilename.aspx
fonte
experimentar
demonstração
https://msdn.microsoft.com/en-gb/library/system.io.path.getfilenamewithoutextension%28v=vs.80%29.aspx
fonte
Você pode usar a API do caminho da seguinte maneira:
Mais informações: Path.GetFileNameWithoutExtension
fonte
Path.GetFileNameWithoutExtension
fonte
Tente o seguinte:
Isso retornará "olá" para fileName.
fonte
fonte
Tente isso,
fonte
fonte
FileVersionInfo
possa ser usado em arquivos que não têm informações de versão. Observe queGetVersionInfo()
só pode ser usado em caminhos que fazem referência a um arquivo que já existe. Embora qualquer classe possa ser usada para obter o nome do arquivo, a pergunta também foi solicitada para remover a extensão.Em primeiro lugar, o código na pergunta não produz a saída descrita. Extrai a extensão do arquivo (
"txt"
) e não o nome da base do arquivo ("hello"
). Para fazer isso, a última linha deve chamarFirst()
, nãoLast()
assim ...Depois de fazer essa alteração, uma coisa a se pensar quanto à melhoria desse código é a quantidade de lixo que ele cria:
string[]
contendo umstring
para cada segmento de caminho empath
string[]
contendo pelo menos umstring
para cada um.
no último segmento de caminho empath
Por conseguinte, extrair o nome do ficheiro de base a partir do caminho de amostra
"C:\Program Files\hello.txt"
deve produzir o (temporária)object
s"C:"
,"Program Files"
,"hello.txt"
,"hello"
,"txt"
, umstring[3]
, e umstring[2]
. Isso pode ser significativo se o método for chamado em um grande número de caminhos. Para melhorar isso, podemos procurarpath
localizar os pontos inicial e final do nome base e usá-los para criar um novostring
...Isso está usando o índice do caractere após o último
\
como o início do nome da base e, a partir daí, procurando o primeiro.
a ser usado como índice do caractere após o final do nome da base. Isso é mais curto que o código original? Não é bem assim. É uma solução "mais inteligente"? Acho que sim. Pelo menos, seria se não fosse o fato de que ...Como você pode ver no comentário, o método anterior é problemático. Embora funcione se você assumir que todos os caminhos terminam com um nome de arquivo com uma extensão, ele emitirá uma exceção se o caminho terminar com
\
(ou seja, um caminho de diretório) ou não contiver nenhuma extensão no último segmento. Para corrigir isso, precisamos adicionar uma verificação extra para explicar quandoendIndex
é-1
(ou.
seja, não foi encontrado) ...Agora, esta versão não é nem de longe mais curta que a original, mas é mais eficiente e (agora) correta também.
Quanto aos métodos .NET que implementam essa funcionalidade, muitas outras respostas sugerem o uso
Path.GetFileNameWithoutExtension()
, que é uma solução óbvia e fácil, mas não produz os mesmos resultados que o código da pergunta. Há uma diferença sutil, mas importante, entreGetFileBaseNameUsingSplit()
ePath.GetFileNameWithoutExtension()
(GetFileBaseNameUsingPath()
abaixo): o primeiro extrai tudo antes do primeiro.
e o último extrai tudo antes do último.
. Isso não faz diferença para a amostrapath
da pergunta, mas veja esta tabela comparando os resultados dos quatro métodos acima quando chamados com vários caminhos ...... e você verá que
Path.GetFileNameWithoutExtension()
gera resultados diferentes quando passa por um caminho em que o nome do arquivo tem uma extensão dupla ou um inicial e / ou final.
. Você pode experimentá-lo com o seguinte código ...TL; DR O código na pergunta não se comporta como muitos parecem esperar em alguns casos de canto. Se você estiver escrevendo seu próprio código de manipulação de caminho, leve em consideração ...
.
ou tudo antes do último.
?).
.
(provavelmente não é algo que você encontrará no Windows, mas eles são possíveis ).
\
Nem todos os caminhos de arquivo seguem a fórmula usual de
X:\Directory\File.ext
!fonte
fonte