2015-04-15 143 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()分割的解決方案。如果確定每個文件都有擴展名,這可能是比我更聰明的解決方案。但是,如果沒有實際擴展名的文件可能會失敗:-) –