Remover extensão de arquivo de uma string de nome de arquivo


201

Se eu tenho uma string dizendo "abc.txt", existe uma maneira rápida de obter uma substring justa "abc"?

Eu não posso fazer um fileName.IndexOf('.')porque o nome do arquivo poderia ser "abc.123.txt"ou algo assim e, obviamente, só quero me livrar da extensão (ou seja "abc.123").

Respostas:


372

O Path.GetFileNameWithoutExtensionmétodo fornece o nome do arquivo que você passa como argumento sem a extensão, como deve ser óbvio no nome.


1
Iria sugerir: string.Format ("{0} \\ {1}", Path.GetDirectoryName (path), Path.GetFileNameWithoutExtension (path)) ... mas vi uma versão ainda melhor abaixo usando Path.Combine em vez de String.Format!
emery.noel

4
Preservar o caminho não é um efeito desejado, observe que o nome do método é GetFileNameWithoutExtension. Se a preservação do caminho foi prometida, o nome do método deveria ter sido diferente. A descrição do método também é bastante específica, apenas o nome do arquivo sem extensão é retornado. O OP não especifica que ele requer o caminho. Pelo contrário.
quer

@dukevin nada sobre esta questão tem algo a ver com o caminho. Ele simplesmente pede a remoção da extensão do nome do arquivo .
Rory McCrossan

248

Há um método na estrutura para esse fim, que manterá o caminho completo, exceto a extensão.

System.IO.Path.ChangeExtension(path, null);

Se apenas o nome do arquivo for necessário, use

System.IO.Path.GetFileNameWithoutExtension(path);

37
Essa é a resposta correta. A resposta aceita tiras caminho do arquivo
limão

8
Esta é uma resposta melhor, pois preserva o caminho
James H

8
O nullvalor mágico aqui. Se você usar String.Emptyaka, ""você ficará com um .ponto [ ] à direita .
THBBFT

Não concordo que esta resposta seja melhor. GetFileNameWithoutExtensioné mais explícito. Embora seja bom saber sobre seu efeito colateral potencialmente indesejado e a existência de uma alternativa para evitá-lo.
jeromej 8/01

57

Você pode usar

string extension = System.IO.Path.GetExtension(filename);

E remova a extensão manualmente:

string result = filename.Substring(0, filename.Length - extension.Length);

@ Bio, na verdade, esse é o tamanho da extensão e, em seguida, pega o nome do arquivo até a extensão.
Neville

Se você decidir ignorar a funcionalidade System.IO.Path, não será melhor se você obtiver a extensão como: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster 24/09

27

String.LastIndexOf funcionaria.

string fileName= "abc.123.txt";
int fileExtPos = fileName.LastIndexOf(".");
if (fileExtPos >= 0 )
 fileName= fileName.Substring(0, fileExtPos);

10
Cuidado com arquivos sem extensão, como foo/bar.cat/cheese!
Cameron

String.LastIndexOfé perigoso para realizar algo assim. Para arquivos sem extensão, como a @Cameron afirmou acima, seus resultados podem não ser o que você deseja. A maneira mais segura de fazer isso é usando a resposta de @ Logman acima.
Shiva

13

Se você deseja criar o caminho completo sem extensão, pode fazer algo assim:

Path.Combine( Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath))

mas estou procurando uma maneira mais simples de fazer isso. Alguém tem alguma ideia?


8

Eu usei o código abaixo, menos

string fileName = "C:\file.docx";
MessageBox.Show(Path.Combine(Path.GetDirectoryName(fileName),Path.GetFileNameWithoutExtension(fileName)));

A saída será

C: \ arquivo


2
E se meu separador de diretório for '/';)?
Logman

4
Use em Path.Combine()vez de especificar "\\".
Broots Waymb

1

se você quiser usar a operação String, poderá usar a função lastIndexOf () que Pesquisa a última ocorrência de um caractere ou substring. Java possui inúmeras funções de string.


1

Você talvez não esteja pedindo a API da UWP. Mas em UWP, file.DisplayNameé o nome sem extensões. Espero que seja útil para os outros.


0

Eu sei que é uma pergunta antiga e Path.GetFileNameWithoutExtensioné uma opção melhor e talvez mais limpa. Mas, pessoalmente, adicionei esses dois métodos ao meu projeto e queria compartilhá-los. Isso requer C # 8.0 devido a ele usar intervalos e índices.

public static string RemoveExtension(this string file) => ReplaceExtension(file, null);

public static string ReplaceExtension(this string file, string extension)
{
    var split = file.Split('.');

    if (string.IsNullOrEmpty(extension))
        return string.Join(".", split[..^1]);

    split[^1] = extension;

    return string.Join(".", split);
}

-1
    /// <summary>
    /// Get the extension from the given filename
    /// </summary>
    /// <param name="fileName">the given filename ie:abc.123.txt</param>
    /// <returns>the extension ie:txt</returns>
    public static string GetFileExtension(this string fileName)
    {
        string ext = string.Empty;
        int fileExtPos = fileName.LastIndexOf(".", StringComparison.Ordinal);
        if (fileExtPos >= 0)
            ext = fileName.Substring(fileExtPos, fileName.Length - fileExtPos);

        return ext;
    }

2
Isso não responde à pergunta.
Rapptz

1
Por que você escreveria um método de extensão para isso? Além desse caso muito específico, String.GetFileExtension () não faz nenhum sentido. No entanto, a função é carregada em todos os lugares e deve denotar comportamento específico para qualquer String. O que não é o caso.

-3
        private void btnfilebrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            //dlg.ShowDialog();
            dlg.Filter = "CSV files (*.csv)|*.csv|XML files (*.xml)|*.xml";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string fileName;
                fileName = dlg.FileName;
                string filecopy;
                filecopy = dlg.FileName;
                filecopy = Path.GetFileName(filecopy);
                string strFilename;
                strFilename = filecopy;
                 strFilename = strFilename.Substring(0, strFilename.LastIndexOf('.'));
                //fileName = Path.GetFileName(fileName);             

                txtfilepath.Text = strFilename;

                string filedest = System.IO.Path.GetFullPath(".\\Excels_Read\\'"+txtfilepath.Text+"'.csv");
               // filedest = "C:\\Users\\adm\\Documents\\Visual Studio 2010\\Projects\\ConvertFile\\ConvertFile\\Excels_Read";
                FileInfo file = new FileInfo(fileName);
                file.CopyTo(filedest);
             // File.Copy(fileName, filedest,true);
                MessageBox.Show("Import Done!!!");
            }
        }

Não basta postar o código, é muito mais útil explicar sua resposta ao lado do código.
SuperBiatedMan

1
Grande parte do código é completamente irrelevante. Falta explicação. Isso não é útil.
Palec

O código é muito específico para um problema diferente daquele em questão.
Dominic Bett

-4

Esta implementação deve funcionar.

string file = "abc.txt";
string fileNoExtension = file.Replace(".txt", "");

11
Que tal abc.txt.pdf? :-)
Palec
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.