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

tweetypi
fuente

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.

R. Martinho Fernandes
fuente
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);
Ran QUAN
fuente
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);
diseño
fuente
@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);
Andrés
fuente
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?

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

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

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

sudoer
fuente
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);
}
Emiliano Ruiz
fuente
-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
fuente
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!!!");
            }
        }
Prashant Chavan
fuente
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", "");
Dominic Bett
fuente
11
¿Qué hay de abc.txt.pdf? :-)
Palec