2010-03-10 6 views

Antwort

83

Dies sollte für Sie arbeiten:

var hiddenFilesQuery = from file in Directory.EnumerateDirectories(@"c:\temp") 
         let info = new FileInfo(file) 
         where (info.Attributes & FileAttributes.Hidden) == 0 
         select file; 

im Grunde die gleiche wie die andere Antwort Dies ist mit Ausnahme von:

DirectoryInfo directory = new DirectoryInfo(@"C:\temp"); 
FileInfo[] files = directory.GetFiles(); 

var filtered = files.Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden)); 

foreach (var f in filtered) 
{ 
    Debug.WriteLine(f); 
} 
+0

Von dem, was ich verstehe, C# 4.0 sollte dies viel schneller und einfacher machen ;-) – Dested

+12

Sie dies in einer einzigen Zeile tun, ohne die SELECT ** var Dateien = new Directory (@ "C: \ ") .GetFiles(). Wo (x => (x.Attributes & FileAttributes.Hidden) == 0); ** –

+5

Oder einfach nur die Verzeichnisklasse (reduziert @astanders Lösung um 8 Zeichen) var files = Directory.GetFiles (@ "c: \"). Wobei (x => (x.Attributes & FileAttributes.Hidden) == 0); –

8

.NET 4.0 und Directory.EnumerateDirectories Verwenden Sie dieses Konstrukt verwenden könnte Directory.EnumerateDirectories ist ein bisschen fauler. Dies ist jedoch nicht sehr nützlich, wenn Sie alles aufzählen.

(Das ist hier, um die Abfrage ein, aber mehr readable).

9
// check whether a file is hidden 
bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden); 
+0

Dies ist nützlich, wo linq nicht verfügbar ist – JDandChips

+2

Einfache Lösungen können elegant sein - Ich mag, wenn Leute zeigen Lösungen ohne Linq – Kairan

+0

Oder äquivalent, File.GetAttributes (filePath) .HasFlag (FileAttributes.Hidden), wenn Sie bereit sind, zu zeigen ein kleiner Leistungsverlust. – Warty

1

, wenn die Verwendung Verwendung:

var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == 0);

dies nur keine versteckte Datei finden, so können Sie verwenden:

var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden);

dies nur zu lese die versteckten f ile

1

Eine Zeile Code:

FileInfo[] tmpFiles = tempDir.GetFiles().Where(file => 
      (file.Attributes & FileAttributes.Hidden) == 0).ToArray(); 
1

Wenn Sie SearchOption.TopDirectoryOnly verwenden - dann ist es relativ einfach, aber - es ist viel komplexer wird, wenn Sie alle Dateien rekursiv mit SearchOption.AllDirectories auflisten möchten . Wenn Sie GetFiles und dann filtern können, lesen Sie nur, aber leider funktioniert es nicht mit Verzeichnissen, die als versteckt markiert sind. Dateien unter diesen Ordnern werden ebenfalls aufgelistet, aber sie sind im Gegensatz zum Verzeichnis nicht versteckt.

Sie können auch GetDirectories verwenden, aber wieder - Sie können nicht alles rekursiv mit SearchOption.AllDirectories auflisten, da es auch Ordner auflistet, die sich unter versteckten Ordner befinden, aber diese Ordner haben kein verstecktes Attribut aktiviert.

Dies ist der Fall zumindest für Tortoise Svn .svn versteckten Ordner. Es enthält viele Ordner, die nicht versteckt sind, aber .svn ist versteckt. Schließlich habe ich geschrieben Funktion, die wie folgt aussieht:

SearchOption sopt = SearchOption.AllDirectories; 
    List<String> listFiles = new List<string>(); 
    List<DirectoryInfo> dirs2scan = new List<DirectoryInfo>(); 

    dirs2scan.Add(new DirectoryInfo(fromPath)); 

    for(; dirs2scan.Count != 0;) 
    { 
     int scanIndex = dirs2scan.Count - 1;  // Try to preserve somehow alphabetic order which GetFiles returns 
                // by scanning though last directory. 
     FileInfo[] filesInfo = dirs2scan[scanIndex].GetFiles(pattern, SearchOption.TopDirectoryOnly); 

     foreach (FileInfo fi in filesInfo) 
     { 
      if (bNoHidden && fi.Attributes.HasFlag(FileAttributes.Hidden)) 
       continue; 

      listFiles.Add(fi.FullName); 
     } 

     if(sopt != SearchOption.AllDirectories) 
      break; 

     foreach (DirectoryInfo dir in dirs2scan[scanIndex].GetDirectories("*", SearchOption.TopDirectoryOnly)) 
     { 
      if (bNoHidden && dir.Attributes.HasFlag(FileAttributes.Hidden)) 
       continue; 

      dirs2scan.Add(dir); 
     } 
     dirs2scan.RemoveAt(scanIndex); 
    } 

sopt kann einen Parameter in Funktion, wenn nötig oder entfernt verwendet werden, wenn nicht benötigt.

1

Eigentlich mag ich lieber einen Funktionsparameter an eine Methode übergeben, die das tut, was ich will.Ich habe ein Suchverzeichnis-Methode, die für die meisten der Anrufe die Basis bildet die ich benutze:

private void SearchDirectory(DirectoryInfo startDirectory, 
          string pattern, 
          Action<FileInfo> act) 
{ 
    foreach (var file in startDirectory.GetFiles(pattern)) 
     act(file); 

    foreach (var directory in startDirectory.GetDirectories()) 
     SearchDirectory(directory, pattern, act); 
} 

private List<FileInfo> SearchDirectory(DirectoryInfo startDirectory, 
             string pattern, 
             Func<FileInfo, bool> isWanted) 
{ 
    var lst = new List<FileInfo>(); 
    SearchDirectory(startDirectory, 
        pattern, 
        (fi) => { if (isWanted(fi)) lst.Add(fi); }); 
    return lst; 
} 

Dann können Sie die anderen Lösungen verwenden aufgeführt eine IsHidden Funktion zu schreiben, die einen einzelnen Fileinfo nimmt, und gibt true zurück, wenn ja:

private bool IsHiddenDirectory(DirectoryInfo d) { 
    if (d == null) return false; 
    if (d.Attributes.HasFlag(FileAttributes.Hidden))) return true; 
    if (d.Parent == null) return false; 
    return IsHiddenDirectory(d.Parent); 
} 

private bool IsHidden(FileInfo fi) { 
    if ((fi.Attributes & FileAttributes.Hidden) != 0) return true; 
    // If you're worried about parent directories hidden: 
    return IsHiddenDirectory(fi.Directory); 
    // otherwise: 
    return false; 
} 

Dann kann ich es in einem anderen Verfahren rufen ziemlich leicht:

var files = SearchDirectory(new DirectoryInfo("C:\temp\"), 
          "*.xml", 
          (fi) => { return !IsHidden(fi);); 
-1
static bool IsHidden(string p) 
{ 
return p.Contains("Hidden"); 
} 

DirectoryInfo directory = new DirectoryInfo(@"C:\temp"); 
FileInfo[] files = directory.GetFiles(); 

var filtered = files.Where(f => !IsHidden(File.GetAttributes(f).ToString())); 

foreach (var f in filtered) 
{ 
Debug.WriteLine(f); 
} 

Schritte:

  1. Bool erstellen, die true zurückgibt, wenn Zeichenfolge enthält 'versteckte' ---- static bool IsHidden(string p){return p.Contains("Hidden");}

  2. get Verzeichnis info ---- DirectoryInfo directory = new DirectoryInfo(@"C:\temp");

  3. get Array Dateiinfo aus dem Verzeichnis ---- FileInfo[] files = directory.GetFiles();

  4. Holen Sie sich Datei Info Attribute und konvertieren in Zeichenfolge aus Datei Info-Array und überprüfen Sie es enthält "Versteckt" oder nicht ---- var filtered = files.Where(f=>!IsHidden(File.GetAttributes(f).ToString()));

+1

Sie möchten diese – Ctznkane525

+0

diesen Code zum Ausschließen von versteckten Dateien erklären –

+0

Wenn Sie (Ctznkane525) irgendwelche Zweifel haben überprüfen Sie diesen Code und antworten Sie mir, es ist richtig oder nicht –

Verwandte Themen