2012-12-13 41 views
0

這是我的示例文件名Text_2.23.txt 我已經分開了擴展名,但我無法獲取版本,所以稍後可以在代碼中使用它進行比較。我需要得到2.23從文件名提取版本

編輯:文件名可以有各種形式,但版本是在文件名末尾的allways。

string s = f1.Name.ToString(); //for the Filename 
int k = s.LastIndexOf('.'); 
string lhs = k < 0 ? s : s.Substring(0, k), 
    rhs = k < 0 ? "" : s.Substring(k + 1); 

char[] array = lhs.ToCharArray(); 

Array.Reverse(array);   // reverse search from right to left 
for (int j = 0; j < array.Length; j++) 
{ 
    char letter = array[j];  //the letter I get out in the sample case is "3" 
} 
+0

把它弄出來的呢?一個'int'?你可以期待什麼樣的文件格式? (否則,您可以放棄'Text_'部分) – rae1

+0

文件名總是以' _ 的形式出現。 '? – Niklas

+0

你不能有2.23作爲一個整數 - 如果你想要一個整數你可以有2或3個,或者如果你想要兩個單獨的整數,你可以有2和23個 – Grhm

回答

4

使用PathVersion類:

string fileName = "Text_2.23.txt"; 
string fn = Path.GetFileNameWithoutExtension(fileName); 
string[] parts = fn.Split('_'); 

Version v; 
if (parts.Length > 1 && Version.TryParse(parts.Last(), out v)) 
{ 
    Console.Write("Major:{0}, Minor:{1}", v.Major, v.Minor); 
} 

Demo

編輯:既然你有評論說你的文件名幾乎可以是任意的,但版本總是在最後,你只是想要那string

有了您的評論樣本:

string[] fileNames = new[] { "teext_023.ext", "txtxt.x9.08.ext", "text0911.ext" }; 
string[] versions = fileNames 
    .Select(fileName => 
     Path.GetFileNameWithoutExtension(fileName).Split('_') 
      .Last() 
      .Reverse() 
      .TakeWhile(c => c == '.' || Char.IsDigit(c)) 
      .Reverse() 
    ).Select(chars => new string(chars.ToArray())).ToArray(); 

Demo

+0

我建議你可能想使用'.LastOrDefault()'並檢查爲空,以確保處理時的文件名沒有下劃線'_'字符 – Grhm

+0

我擔心可能有多個下劃線,例如。 'My_file_2.23.txt'。正如你所說'Split('_')。LastOrDefault()'不檢查空輸入,也不輸入沒有下劃線。 但我認爲現在我們已經提出了可能很重要的輸入檢查和異常類型 - 我很高興OP能夠根據預期的/允許的輸入以及可接受的失敗模式來決定...... – Grhm

+0

這是一個小的可能性,但可能會有更多數字的文件名。這就是爲什麼我需要檢查字符之後的字符從右到左,直到我得到一個非數字字符 – anzes

0

這就是我一直在尋找,解決我的問題,一個簡單的辦法:

   Array.Reverse(array); 
       Boolean dot = false; 
       for (int j = 0; j < array.Length; j++) 
       { 
        char letter = array[j]; 
        if (char.IsNumber(letter)) 
        { 
         version += letter.ToString(); 
        } 
        else if (letter == '.') 
        { 
         if (dot) 
         { 
          break; 
         } 
         dot = true; 
        } 
       } 
       version = this.Reverse(version); 

       if (version.Equals("")) 
       { 
        version = "0"; 
       }