2010-05-26 60 views
11

我需要從一個文件夾中獲得的第一個文件名。我怎樣才能得到這個在C#中?如何採取第一個文件名從文件夾中的C#

下面的代碼返回所有的文件名:

DirectoryInfo di = new DirectoryInfo(imgfolderPath); 
foreach (FileInfo fi in di.GetFiles()) 
{ 
    if (fi.Name != "." && fi.Name != ".." && fi.Name != "Thumbs.db") 
    { 
     string fileName = fi.Name; 
     string fullFileName = fileName.Substring(0, fileName.Length - 4); 

     MessageBox.Show(fullFileName); 
    } 
} 

我需要的第一個文件名。

+7

如果你接受一些答案到你的其他問題的,人們會更容易幫助你。 – 2010-05-26 11:33:12

+0

一個更好的標題可能是這樣的:「如何找到在C#中的文件夾相匹配的謂語的文件名」您正在使用什麼版本的.NET的 – 2010-05-26 11:37:20

+1

? – 2010-05-26 11:41:38

回答

24

有你能做到這幾個方面:

  • 你可以處理的第一個文件後添加break聲明。這將退出foreach循環。

  • DirectoryInfo.GetFiles返回一個數組,因此您可以將它分配給一個變量並掃描元素,直到找到合適的元素。

  • 或者,如果你使用的是.NET 3.5,你可以看看FirstOrDefault方法與謂語。

下面是一些代碼:

string firstFileName = 
    di.GetFiles() 
     .Select(fi => fi.Name) 
     .FirstOrDefault(name => name != "Thumbs.db"); 
+0

哦謝謝..但我試圖宣佈數組和blay巴拉.. 反正謝謝 – riad 2010-05-26 11:27:55

+0

最可接受的答案...謝謝兄弟。 – riad 2010-05-26 12:12:47

+0

考慮到'GetFiles'枚舉目錄中的所有文件以創建一個數組,在這種情況下使用'EnumerateFiles'會更有效率。有關更多信息,請參閱https://msdn.microsoft.com/en-us/library/wz42302f(v=vs.110).aspx – Vlad 2017-03-21 03:08:35

4
FileInfo fi = di.GetFiles()[0]; 

注:

  • 的代碼拋出一個異常,如果沒有文件。
  • 「第一」是不明確的 - 你的意思是任何文件,或按字母順序的第一個?在後一種情況下,您可能需要擔心諸如區分大小寫和區域依賴性排序等內容。
1
using System.IO; 
using System.Linq; 

var firstFile = Path.GetFileName(Directory.GetFiles(@"c:\dir", "*.*") 
    .FirstOrDefault(f => !String.Equals(
     Path.GetFileName(f), 
     "Thumbs.db", 
     StringComparison.InvariantCultureIgnoreCase))); 
+0

您是否不必提供lambda的完整路徑以獲取Where子句上班?只是好奇? :) – Henric 2010-05-26 11:38:41

+0

注意:您不需要單獨調用Where - FirstOrDefault可以接受謂詞。 – 2010-05-26 11:40:57

+0

對,@Mark Byers,我不認爲上面的代碼是做什麼需要的或者我誤解了某些東西? Directory.GetFiles()返回一個包含完整路徑作爲文件名的字符串,因此您需要在謂詞中考慮這一點。 – Henric 2010-05-26 11:45:22

1

在回答里亞德對我的評論:

除了abatischchev的解決方案:

var file = Directory.GetFiles(@"C:\TestFolder", "*.*") 
      .FirstOrDefault(f => f != @"C:\TestFolder\Text1.txt"); 

我想補充一點,僅保留名稱:

Console.WriteLine(file.Substring(file.LastIndexOf('\\') + 1)); 

其中生成輸出Text2.txt(我有三個文本ti在該文件夾中稱爲Text1.txt,Text2.txt和text3.txt。

6

如果您使用的是.NET 4.0,你應該這樣做,而不是...

var firstFileName = di.EnumerateFiles() 
         .Select(f => f.Name) 
         .FirstOrDefault(); 

... .GetFiles()創建一個數組,因此必須掃描所有文件。 .EnumerateFiles()將返回IEnumerable<FileInfo>,因此它不需要做太多的工作。您可能不會注意到具有少量文件的本地硬盤上的差異。但是網絡共享,拇指驅動器/存儲卡或大量文件會使這一點變得明顯。

+0

可能會得到「Thumbs.db」?!那不對。 – 2015-12-17 08:53:01

+1

什麼?如果您正在查找特定文件,請添加搜索字符串。如果你只是做一個毛毯得到第一個文件,那麼如果這是'thumbs.db'那麼就是這樣。無論哪種方式'.EnumerateFiles(...)'只會一次返回一個文件,這對於擁有大量文件和文件夾的目錄非常有用。 https://msdn.microsoft.com/en-us/library/system.io.directoryinfo.enumeratefiles(v=vs.110).aspx – 2015-12-17 13:25:42

+0

嗨。你是對的。 我使用這個解決方案=> http://stackoverflow.com/a/2912435/1395101但沒有趣? ,因爲可能會返回「* .any文件擴展名」,我需要代碼返回第一個例如.jpg文件。 最後我發現這個解決方案=> http://stackoverflow.com/a/3152180/1395101 – 2015-12-17 20:20:25

相關問題