Eliminar la extensión de archivo de una cadena de nombre de archivo


201

Si tengo una cadena que dice "abc.txt", ¿hay una manera rápida de obtener una subcadena que sea solo"abc" ?

No puedo hacerlo fileName.IndexOf('.')porque el nombre del archivo podría ser "abc.123.txt"o algo así y obviamente solo quiero deshacerme de la extensión (es decir "abc.123").

Respuestas:


372

El Path.GetFileNameWithoutExtensionmétodo le proporciona el nombre de archivo que pasa como argumento sin la extensión, como debería ser obvio por el nombre.


1
Iba a sugerir: string.Format ("{0} \\ {1}", Path.GetDirectoryName (ruta), Path.GetFileNameWithoutExtension (ruta)) ... pero vi una versión aún mejor a continuación usando Path.Combine en lugar de String.Format!
emery.noel

44
Preservar la ruta no es un efecto deseado, tenga en cuenta que el nombre del método es GetFileNameWithoutExtension. Si se prometió la preservación de la ruta, el nombre del método debería haber sido diferente. La descripción del método también es bastante específica, solo se devuelve el nombre de archivo sin extensión. El OP no especifica que necesita la ruta. Todo lo contrario.
Morten Bork

@dukevin nada sobre esta pregunta tiene algo que ver con el camino. Simplemente pide que se elimine la extensión del nombre del archivo .
Rory McCrossan

248

Hay un método en el marco para este propósito, que mantendrá la ruta completa a excepción de la extensión.

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

Si solo se necesita el nombre del archivo, use

System.IO.Path.GetFileNameWithoutExtension(path);

37
Esta es la respuesta correcta. La respuesta aceptada tiras ruta de archivo
limón

8
Esta es una mejor respuesta, ya que conserva el camino
James H

8
El nulltiene un valor mágico aquí. Si usa String.Emptyaka, ""se le dejará un punto final [ .].
THBBFT

No estoy de acuerdo, esta respuesta es mejor. GetFileNameWithoutExtensionEs más explícito. Aunque es agradable saber sobre su efecto secundario potencialmente no deseado y la existencia de una alternativa para evitarlo.
jeromej

57

Puedes usar

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

Y luego elimine la extensión manualmente:

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

@Bio, en realidad eso es la longitud de la extensión, y luego toma el nombre del archivo hasta la extensión.
Neville

Si decide ignorar la funcionalidad de System.IO.Path no es mejor si obtiene la extensión como: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster

28

String.LastIndexOf funcionaría.

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

10
¡Cuidado con los archivos sin extensión, como foo/bar.cat/cheese!
Cameron

String.LastIndexOfes peligroso por lograr algo como esto. Para archivos sin extensión, como @Cameron ha indicado anteriormente, sus resultados pueden no ser lo que desea. La forma más segura de hacerlo es usando la respuesta de @ Logman arriba.
Shiva

13

Si desea crear una ruta completa sin extensión, puede hacer algo como esto:

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

pero estoy buscando una forma más sencilla de hacerlo. ¿Alguien tiene alguna idea?


8

Usé el siguiente, menos código

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

La salida será

C: \ archivo


2
¿Y si mi separador de directorio es '/';)?
Logman

44
Usar en Path.Combine()lugar de especificar "\\".
Broots Waymb

1

si desea usar la operación de cadena, puede usar la función lastIndexOf () que busca la última aparición de un carácter o subcadena. Java tiene numerosas funciones de cadena.


1

Tal vez no le preguntes a la API de UWP. Pero en UWP, file.DisplayNamees el nombre sin extensiones. Espero sea útil para los demás.


0

Sé que es una vieja pregunta y Path.GetFileNameWithoutExtensiones una opción mejor y quizás más limpia. Pero personalmente, he agregado estos dos métodos a mi proyecto y quería compartirlos. Esto requiere C # 8.0 debido a que utiliza rangos 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
Esto no responde la pregunta.
Rapptz

1
¿Por qué escribirías un método de extensión para esto? Aparte de este caso muy específico, String.GetFileExtension () no tiene ningún sentido. Sin embargo, la función se transfiere a todas partes, y se supone que denota el comportamiento específico de cualquier cadena. Que no es el 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!!!");
            }
        }

No solo publique el código, es mucho más útil explicar su respuesta junto con el código.
SuperBiasedMan

1
Gran parte del código es completamente irrelevante. Falta la explicación. Esto no es útil.
Palec

El código es demasiado específico para un problema diferente de uno en cuestión.
Dominic Bett

-4

Esta implementación debería funcionar.

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

11
¿Qué hay de abc.txt.pdf? :-)
Palec
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.