2013-04-08 108 views
4

我的程序的功能基本上是將文件名(包括它的擴展名)從目錄列表到列表框中。然後它有一個排序功能,將列表字符串按字母順序排序。C#從字符串列表中刪除文件擴展名

最後它有一個二進制搜索功能,允許用戶輸入任何字符串,然後程序將比較並將匹配結果顯示到列表框中。

現在,所有這些功能都能正常工作,但是我似乎無法在搜索後刪除文件名的擴展名。

例如,在掃描和分類情況下它列出了文件名稱爲:FILENAME.MP3現在

,我想要它做搜索按鈕被點擊時是刪除文件擴展名,並只顯示文件名。

private void buttonSearch_Click(object sender, RoutedEventArgs e) 
    { 

     listBox1.Items.Clear(); 

     string searchString = textBoxSearchPath.Text; 


     int index = BinarySearch(list1, 0, list1.Count, searchString); 

     for (int n = index; n < list1.Count; n++) 
     { 
      //Removes file extension from last decimal point ''not working'' 
      int i = list1[n].LastIndexOf("."); 
      if (i > 0) 
       list1[n].Substring(0, i); 

      // Adds items to list 
      if (list1[n].IndexOf(searchString, StringComparison.OrdinalIgnoreCase) != 0) break; 
      listBox1.Items.Add(list1[n]); 
     } 
     MessageBox.Show("Done"); 
    } 
+2

Path.GetFileNameWithoutExtension() – 2013-04-08 12:49:22

+0

我不知道如何實現,在我的代碼(以上)我已經處理字符串列表中的文件名稱 – ffxdean 2013-04-08 12:50:35

+0

您可以使用System.IO.Path類中的靜態操作來處理擴展。想到的是GetExtension()或者GetFileNameWithoutExtension()可以想到 即使只有一行,您也應該總是使用{}作爲塊...您的一個塊如果塊不同於第二塊...... – 2013-04-08 12:50:51

回答

2

Substring方法返回從源代碼複製的字符串新的新副本。如果你想「切拓客」,那麼你必須獲取哪些子串回報,它存儲在某處,即:

int i = list1[n].LastIndexOf("."); 
if (i > 0) 
    list1[n] = list1[n].Substring(0, i); 

然而,這是刪除擴展非常奇怪的方式。

首先,使用Substring(0,idx)是奇怪,因爲有一個Remove(idx)(link)這正是這麼做的:

int i = list1[n].LastIndexOf("."); 
if (i > 0) 
    list1[n] = list1[n].Remove(i); 

但是,sencondly,還有的甚至更好的做這件事的方式:System.IO.Path類爲您提供了一整套完善寫靜態方法,例如,去掉擴展名(編輯:這是L-三人在意見提出),具有完全處置點和等:

var str = System.IO.Path.GetFileNameWithoutExtension("myfile.txt"); // == "myfile" 

MSDN link

它仍然返回一個副本,你仍然需要存儲結果的地方!

list1[n] = Path.GetFileNameWithoutExtension(list1[n]); 
+0

對任何負面評價此回覆的人:下次請附上評論,我真的好奇爲什麼。我應該添加更多的解釋或例子,還是「tl; dr」也許?嘿嘿。對不起,我真的很好奇:) – quetzalcoatl 2013-04-08 12:59:49

+0

@ user2257583:沒有問題,從C++可變字符串或Ruby的gsub!():)移動時常見的事情: – quetzalcoatl 2013-04-08 13:02:10

+0

使用Path.GetFileNameWithoutExtension。這就是網點的美麗。 「 – 2013-04-08 13:12:43

1

不知道你是如何實現你的目錄搜索,但你可以在這些情況下,清潔利用LINQ,你的優勢,容易閱讀代碼:

var files = Directory.EnumerateFiles(@"\\PathToFiles") 
      .Select(f => Path.GetFileNameWithoutExtension(f)); 

如果你使用.NET 4.0,枚舉文件似乎是比GetFiles更好的選擇。但是,它也聽起來像你想要獲得完整的文件路徑和文件名而不需要擴展名。這裏是你如何可以創建一個字典,所以你會消除通過收集循環兩次:

var files = Directory.EnumerateFiles(@"\\PathToFiles") 
      .ToDictionary(f => f, n => Path.GetFileNameWithoutExtension(n));