2015-04-15 176 views
0

我们的一个工具在此处维护文件格式如 - file.txt.1。 最后1是总是数字值,并在每个文件保存时增加,以便文件系统具有多个文件。从文件名提取基本名称和扩展名 - file.txt.1

现在在另一个C#应用程序中,我想处理这些文件名。在这我想分裂基地名和扩展名。我使用了Path.GetFilenameWithoutExtension()Path.GetExtension()。在这种情况下,它们将分别返回file.txt和.1。

这迫使我运行另一轮的调用来获取没有扩展名和文件扩展名的文件名。

是否有任何简单/智能的方法来拥有基本名称和扩展名?

+4

不需要。'Path。*'方法是推荐的方法。 – DrKoch

+0

我同意'Path.Get *'是推荐的方法。为了完整起见,我会提到我还看到了诸如'path.Split('\\')。Last()'(用于获取没有目录的文件名)或'filename.Split(' 。')First()'(将文件名称提交到第一个点,即通常会删除扩展名,但可能不止这些),但这些并不会成为特别好的解决方案。 '远离这些。 – stakx

+1

你能修改你的命名策略吗?由于类似这样的原因,像文件(1).txt这样的名称与版本化文件名相比要好得多。 扩展名(最后一个字符串)在窗口中具有非常特殊的含义。没有很好的理由,你不应该改变扩展名。 – DrKoch

回答

1

我不认为有比你的第一个想法更简单的方法。 尽管如此,为此使用正则表达式的优点是,您可以更好地控制使用正确的语法过滤文件。我只写了一个小例子:

... 
using System.IO; 
using System.Text.RegularExpressions; 
... 


string path = @"C:\temp"; 

Regex numExtRegex = new Regex(@"^(.*)\.(\d+)$"); 

foreach (string file in Directory.GetFiles(path)) 
{ 
    Match match = numExtRegex.Match(file); 
    if (match.Success) 
    { 
     string originalFile = match.Groups[1].Value; 
     string numericExtension = match.Groups[2].Value; 

     string originalFileNameWithoutExtension = Path.GetFileNameWithoutExtension(originalFile); 
     string extension = Path.GetExtension(originalFile); 

     Console.WriteLine("File: {0}, numeric extension: {1}, file name w/o ext: {2}, ext: {3}", 
       originalFile, numericExtension, originalFileNameWithoutExtension, extension); 
    } 
} 

正则表达式查找something.digits

使用过滤这种方式,你可以肯定,你不处理如一个有人放入目录的readme.txt ...

+0

嗯,错字纠正,正则表达式,不扩展名:-) –

+1

'^(。+)\。(\ w +)\。(\ d +)$'不工作更好? 3个捕获组捕获数字扩展名,“实际”扩展名和文件名的其余部分。该操作演示的模式是'filename.extension.digits'。 – christophano

+0

是的,好主意和不需要Path.Xx()分割的解决方案。如果确定每个文件都有扩展名,这可能是比我更聪明的解决方案。但是,如果没有实际扩展名的文件可能会失败:-) –