从文件名字符串中删除文件扩展名


201

如果我有一个字符串说"abc.txt",有没有一种快速的方法来获得一个公正的子字符串"abc"

我不能这样做,fileName.IndexOf('.')因为文件名可以是"abc.123.txt"或类似的东西,而我显然只是想摆脱扩展名(即"abc.123")。

Answers:


372

Path.GetFileNameWithoutExtension方法为您提供作为参数传递的文件名,不带扩展名,这从名称中可以明显看出。


1
会建议:string.Format(“ {0} \\ {1}”,Path.GetDirectoryName(path),Path.GetFileNameWithoutExtension(path))...但是我看到下面使用Path.Combine而不是更好的版本String.Format!
emery.noel

4
保留路径不是理想的效果,请注意方法名称为GetFileNameWithoutExtension。如果承诺保留路径,则方法名称应该不同。方法说明也很具体,仅返回不带扩展名的文件名。OP未指定他需要路径。恰恰相反。
Morten Bork

@dukevin与这个问题无关,与路径有关。它只是要求从文件名中删除扩展
罗里·麦克罗斯

248

框架中有一个用于此目的的方法,除了扩展之外,它将保留完整路径。

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

如果仅需要文件名,请使用

System.IO.Path.GetFileNameWithoutExtension(path);

37
这是正确的答案。接受的答案条文件路径
柠檬

8
这是一个更好的答案,因为它可以保留路径
James H

8
null这里具有神奇的价值。如果使用String.Emptyaka "",则将留下尾随的[ .]点。
THBBFT

我不同意这个答案更好。GetFileNameWithoutExtension更明确。尽管很高兴知道其潜在的不良副作用以及避免该副作用的替代方法的存在。
jeromej

57

您可以使用

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

然后手动删除扩展名:

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

@Bio,实际上就是扩展名的长度,然后获取文件名直到扩展名。
内维尔

如果您决定忽略System.IO.Path功能,那么将扩展名设为:string extension = filename.Substring(filename.LastIndexOf('。'));并不是更好。?
QMaster

27

String.LastIndexOf将起作用。

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

10
当心没有扩展名的文件,例如foo/bar.cat/cheese
卡梅伦

String.LastIndexOf完成这样的事情很危险。对于没有扩展名的文件(如@Cameron所述),您的结果可能不是您想要的。最安全的方法是使用上面@Logman的答案。
希瓦

13

如果要创建不带扩展名的完整路径,可以执行以下操作:

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

但我正在寻找更简单的方法。有人有什么主意吗?


8

我用下面的代码

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

输出将是

C:\文件


2
以及如果我的目录分隔符是'/';)?
Logman

4
使用Path.Combine()而不是指定"\\"
布罗特斯·韦姆布

1

如果要使用字符串操作,则可以使用函数lastIndexOf(),该函数搜索字符或子字符串的最后一次出现。Java具有许多字符串函数。


1

您可能不询问UWP API。但是在UWP中,file.DisplayName是没有扩展名的名称。希望对别人有用。


0

我知道这是一个古老的问题,Path.GetFileNameWithoutExtension是一个更好甚至更清洁的选择。但是我个人已将这两种方法添加到我的项目中,并希望共享它们。由于使用范围和索引,因此需要C#8.0。

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
这不能回答问题。
拉普兹2014年

1
为什么要为此编写扩展方法?除了这种非常特殊的情况之外,String.GetFileExtension()毫无意义。但是,该函数随处携带,并且应该表示特定于任何String的行为。事实并非如此。

-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!!!");
            }
        }

请不要仅仅发布代码,在代码旁边解释您的答案会更有帮助。
SuperBiasedMan 2015年

1
大部分代码是完全无关的。缺少说明。这没有用。
Palec

该代码过于特定于与所讨论问题不同的问题。
多米尼克·贝特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.