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

C# 从文件名字符串中删除文件扩展名,c#,string,parsing,C#,String,Parsing,如果我有一个字符串说“abc.txt”,有没有一种快速的方法来获取一个子字符串,它就是“abc” 我不能做文件名.IndexOf('.'),因为文件名可能是“abc.123.txt”或其他什么,我显然只是想去掉扩展名(即“abc.123”)。您可以使用 string extension = System.IO.Path.GetExtension(filename); 然后手动删除扩展名: string result = filename.Substring(0, filename.Length

如果我有一个字符串说
“abc.txt”
,有没有一种快速的方法来获取一个子字符串,它就是
“abc”

我不能做
文件名.IndexOf('.')
,因为文件名可能是
“abc.123.txt”
或其他什么,我显然只是想去掉扩展名(即
“abc.123”
)。

您可以使用

string extension = System.IO.Path.GetExtension(filename);
然后手动删除扩展名:

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

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

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

string.LastIndexOf可以工作

string fileName= "abc.123.txt";
int fileExtPos = fileName.LastIndexOf(".");
if (fileExtPos >= 0 )
 fileName= fileName.Substring(0, fileExtPos);
//
///从给定的文件名获取扩展名
/// 
///给定的文件名为:abc.123.txt
///扩展名ie:txt
公共静态字符串GetFileExtension(此字符串文件名)
{
string ext=string.Empty;
int fileExtPos=fileName.LastIndexOf(“.”,StringComparison.Ordinal);
如果(fileExtPos>=0)
ext=fileName.Substring(fileExtPos,fileName.Length-fileExtPos);
返回ext;
}

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

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

但我正在寻找更简单的方法。有人知道吗?

框架中有一种方法可以实现这一目的,它将保留除扩展之外的完整路径

System.IO.Path.ChangeExtension(path, null);
如果只需要文件名,请使用

System.IO.Path.GetFileNameWithoutExtension(path);

我使用了下面的代码

string fileName=“C:\file.docx”;
Show(Path.Combine(Path.GetDirectoryName(文件名),Path.GetFileNameWithoutExtension(文件名));
输出将是

C:\文件


这一实施应该有效

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

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

我知道这是个老问题,
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);
}


@Bio,实际上,这是扩展名的长度,然后将文件名一直保留到扩展名。如果决定忽略System.IO,那么将扩展名设置为:string extension=filename.Substring(filename.LastIndexOf('.'));,则路径功能并不更好?注意没有扩展名的文件,如
foo/bar.cat/cheese
String.LastIndexOf
对于完成这样的任务是危险的。对于没有扩展名的文件,如@Cameron所述,您的结果可能不是您想要的。最安全的方法是使用this并不能回答问题。为什么要为此编写扩展方法?除此之外,String.GetFileExtension()毫无意义。但是,函数到处都有,它应该表示特定于任何字符串的行为。事实并非如此。请不要只发布代码,在代码旁边解释你的答案会更有帮助。代码的大部分是完全不相关的。没有解释。这是没有用的。代码对于一个与问题不同的问题太具体了。这是正确的答案。接受的答案带文件路径这是一个更好的答案,因为它保留了路径
null
在这里有一个神奇的值。如果你使用
String.Empty
aka
你将留下一个尾随[
]点。我不同意这个答案更好
GetFileNameWithoutExtension
更明确。尽管了解其潜在的不希望的副作用以及避免副作用的替代方案是很好的。那么
abc.txt.pdf
?:-)呢将建议:string.Format(“{0}\\{1}”、Path.GetDirectoryName(Path)、Path.GetFileNameWithoutExtension(Path))。。。但我在下面看到了一个更好的版本,它使用Path.Combine而不是String.Format!保留路径不是期望的效果,请注意,方法名为GetFileNameWithoutExtension。如果承诺保留路径,那么方法名称应该不同。方法描述也非常具体,只返回不带扩展名的文件名。OP没有指定他需要路径。恰恰相反。@dukevin这个问题与路径无关。它只是要求从文件名中删除扩展名。对于需要扩展名的人,完全限定的函数名是System.IO.path.GetFileName WithOutExtension,如果我的目录分隔符是“/”;),该怎么办?使用
Path.Combine()
而不是指定
“\\”
string file = "abc.txt";
string fileNoExtension = file.Replace(".txt", "");
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);
}