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").

tweetypi
fonte

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.

R. Martinho Fernandes
fonte
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);
Ran QUAN
fonte
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);
phdesign
fonte
@ 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);
Andrew
fonte
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?

Logman
fonte
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

Benjym
fonte
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.

Shraddha
fonte
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.

sudoer
fonte
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);
}
Emiliano Ruiz
fonte
-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;
    }
shmaltzy
fonte
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!!!");
            }
        }
Prashant Chavan
fonte
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", "");
Dominic Bett
fonte
11
Que tal abc.txt.pdf? :-)
Palec