如果我有一个字符串说"abc.txt",有没有一个快速的方法来获得一个子字符串,只是"abc"?
"abc.txt"
"abc"
我不能做fileName.IndexOf('.'),因为文件名可以是"abc.123.txt"或其他东西,我显然只是想摆脱扩展名(即"abc.123")。
fileName.IndexOf('.')
"abc.123.txt"
"abc.123"
你可以使用
string extension = System.IO.Path.GetExtension(filename);
然后手动删除扩展:
string result = filename.Substring(0, filename.Length - extension.Length);
Path.GetFileNameWithoutExtension方法提供了作为参数传递的文件名,没有扩展名,这从名称中应该很明显。
Path.GetFileNameWithoutExtension
如果你想使用字符串操作,那么你可以使用lastIndexOf()函数,它搜索字符或子字符串的最后一次出现。Java有很多字符串函数。
字符串。LastIndexOf可以工作。
string fileName= "abc.123.txt"; int fileExtPos = fileName.LastIndexOf("."); if (fileExtPos >= 0 ) fileName= fileName.Substring(0, fileExtPos);
/// <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; }
如果你想创建没有扩展的完整路径,你可以这样做:
Path.Combine( Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath))
但我想找一种更简单的方法。有人知道吗?
框架中有一个用于此目的的方法,该方法将保留除扩展之外的完整路径。
System.IO.Path.ChangeExtension(path, null);
如果只需要文件名,请使用
System.IO.Path.GetFileNameWithoutExtension(path);
我使用了下面较少的代码
string fileName = "C:\file.docx"; MessageBox.Show(Path.Combine(Path.GetDirectoryName(fileName),Path.GetFileNameWithoutExtension(fileName)));
输出将是
文件C: \
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!!!"); } }
这个实现应该可以工作。
string file = "abc.txt"; string fileNoExtension = file.Replace(".txt", "");
file.DisplayName
我知道这是一个老问题,__abc0是一个更好的,可能更干净的选择。但就我个人而言,我已经将这两个方法添加到我的项目中,并希望与大家分享。这需要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); }
ReadOnlySpan<char> filename = "abc.def.ghi.txt"; var fileNameWithoutExtension = RemoveFileExtension(filename); //abc.def.ghi string RemoveFileExtension(ReadOnlySpan<char> path) { var lastPeriod = path.LastIndexOf('.'); return (lastPeriod < 0 ? path : path[..lastPeriod]).ToString(); }