2010-05-26 9 views
11

Ich muss den ersten Dateinamen aus einem Ordner abrufen. Wie kann ich das in C# bekommen?So nehmen Sie den ersten Dateinamen aus einem Ordner in C#

Der folgende Code gibt die alle Dateinamen:

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); 
    } 
} 

Ich brauche die ersten Dateinamen.

+7

Wenn Sie einige der Antworten auf Ihre anderen Fragen akzeptieren, werden die Menschen Ihnen eher helfen. –

+0

Ein besserer Titel könnte etwa lauten: "So finden Sie einen Dateinamen, der mit einem Vergleichselement aus einem Ordner in C# übereinstimmt" –

+1

Welche .NET-Version verwenden Sie? –

Antwort

24

Es gibt ein paar Möglichkeiten, wie Sie dies tun könnte:

  • Sie könnten nach dem Umgang mit der ersten Datei eine break Anweisung hinzufügen. Dies beendet die foreach-Schleife.

  • DirectoryInfo.GetFiles gibt ein Array zurück, so dass Sie es einer Variablen zuweisen und durch die Elemente scannen können, bis Sie ein geeignetes Element finden.

  • Oder wenn Sie .NET 3.5 verwenden, können Sie die FirstOrDefault Methode mit einem Prädikat betrachten.

Hier einige Code:

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

oh danke..aber ich versuchte Array zu erklären und blay .. trotzdem danke – riad

+0

Die meisten akzeptablen Antworten ... danke bro. – riad

+0

Da "GetFiles" alle Dateien im Verzeichnis aufzählt, um ein Array zu erstellen, wäre es effizienter, in diesem Fall 'EnumerateFiles' zu verwenden. Weitere Informationen finden Sie unter https://msdn.microsoft.com/en-us/library/wz42302f(v=vs.110).aspx – Vlad

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

Hinweise:

  • Der Code löst eine Ausnahme, wenn es keine Dateien.
  • "Erste" ist mehrdeutig - meinst du irgendeine Datei, oder die erste alphabetisch? In letzterem Fall müssen Sie sich möglicherweise um Dinge wie Groß-/Kleinschreibung und Gebietsschema-abhängige Sortierung kümmern.
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

Müssten Sie nicht den vollständigen Pfad zum Lambda angeben, um die Where-Klausel zu erhalten arbeiten? Nur neugierig? :) – Henric

+0

Hinweis: Sie brauchen keinen separaten Aufruf von Where - FirstOrDefault kann ein Prädikat akzeptieren. –

+0

Wahr, @Mark Byers, und ich glaube nicht, dass der obige Code das tut, was erforderlich ist, oder missverstehe ich etwas? Directory.GetFiles() gibt eine Zeichenfolge zurück, die die vollständigen Pfade als Dateinamen enthält. Daher müssen Sie dies auch im Prädikat berücksichtigen. – Henric

1

In Antwort auf mich Riads Kommentar:

Neben abatischchev Lösung:

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

Ich würde dies nur hinzufügen, um den Namen zu erhalten:

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

Das erzeugt den Ausgang Text2.txt (ich habe drei Texte ti les in diesem Ordner namens Text1.txt, Text2.txt und text3.txt.

6

Wenn Sie mit .Net 4.0 sollten Sie diese stattdessen tun ...

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

... .GetFiles() erstellt ein Array und als solche müssen alle Dateien scannen. .EnumerateFiles() wird eine IEnumerable<FileInfo> zurückgeben, so dass es nicht so viel Arbeit machen muss. Wahrscheinlich werden Sie auf einer lokalen Festplatte mit einer kleinen Anzahl von Dateien keinen Unterschied bemerken. Aber eine Netzwerkfreigabe, ein USB-Stick/eine Speicherkarte oder eine große Anzahl von Dateien würde dies offensichtlich machen.

+0

vielleicht "Thumbs.db" bekommen?! das stimmt nicht. –

+1

Was? Wenn Sie nach einer bestimmten Datei suchen, fügen Sie die Suchzeichenfolge hinzu. Wenn du nur eine Decke machst, hole die erste Datei, dann, wenn das 'Daumen.db' ist, dann ist es genau das Richtige. In beiden Fällen '.EnumerateFiles (...)' gibt nur Dateien nacheinander zurück, was in Verzeichnissen mit vielen Dateien und Ordnern sehr hilfreich ist. https://msdn.microsoft.com/en-us/library/system.io.directoryinfo.enumeratefiles(v=vs.110).aspx –

+0

Hallo. Du hast recht. Ich benutze diese Lösung => http://stackoverflow.com/a/2912435/1395101 aber nicht interessant?! da kann "* .any Dateierweiterung" zurückgegeben werden und ich brauche Code zuerst nur für Beispiel .jpg Datei zurückgegeben. am Ende fand ich diese Lösung => http://stackoverflow.com/a/3152180/1395101 –

Verwandte Themen