Directory.GetFiles()
gibt alle Dateien zurück, auch die, die als ausgeblendet markiert sind. Gibt es eine Möglichkeit, eine Liste von Dateien zu erhalten, die versteckte Dateien ausschließt?C# - Eine Liste der Dateien mit Ausnahme der versteckten Dateien abrufen
Antwort
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);
}
.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).
// check whether a file is hidden
bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden);
Dies ist nützlich, wo linq nicht verfügbar ist – JDandChips
Einfache Lösungen können elegant sein - Ich mag, wenn Leute zeigen Lösungen ohne Linq – Kairan
Oder äquivalent, File.GetAttributes (filePath) .HasFlag (FileAttributes.Hidden), wenn Sie bereit sind, zu zeigen ein kleiner Leistungsverlust. – Warty
, 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
Eine Zeile Code:
FileInfo[] tmpFiles = tempDir.GetFiles().Where(file =>
(file.Attributes & FileAttributes.Hidden) == 0).ToArray();
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.
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););
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:
Bool erstellen, die true zurückgibt, wenn Zeichenfolge enthält 'versteckte' ----
static bool IsHidden(string p){return p.Contains("Hidden");}
get Verzeichnis info ----
DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
get Array Dateiinfo aus dem Verzeichnis ----
FileInfo[] files = directory.GetFiles();
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()));
Sie möchten diese – Ctznkane525
diesen Code zum Ausschließen von versteckten Dateien erklären –
Wenn Sie (Ctznkane525) irgendwelche Zweifel haben überprüfen Sie diesen Code und antworten Sie mir, es ist richtig oder nicht –
- 1. Die Liste der Dateien im Dokumentenordner abrufen
- 2. Liste der Titel aus XML-Dateien abrufen
- 3. Liste der Dateien im aktuellen Verzeichnis abrufen
- 4. Ausblenden der versteckten Linux-Dateien in Windows
- 5. Abrufen der Liste der Dateien sortiert nach Änderungsdatum in Perl
- 6. Liste der Dateien analysieren
- 7. Wie versteckten Dateien in fs.readdir Ergebnis
- 8. Liste der Dateien in Cloud Storage (Java) abrufen
- 9. Bash: cat mehrere Dateien aus der Liste der Dateien
- 10. Android Liste der Dateien zählen
- 11. Git-Liste der gestaffelten Dateien
- 12. Erste Liste der Dateien in einem Ordner mit C
- 13. Tabelle Liste der Dateien mit Suche
- 14. Liste der ausgewählten Dateien von Windows Desktop
- 15. Wie mercurial alle versteckten Dateien ignorieren?
- 16. WebUrls der letzten Dateien in OneDrive abrufen
- 17. Schleife durch Liste der Dateien in Makefile
- 18. Anzahl der Dateien in einem Verzeichnis abrufen
- 19. Wie lösche ich Dateien im versteckten Verzeichnis?
- 20. Powershell - Löschen von Dateien mit der Liste der Dateinamen
- 21. Abrufen der Liste der Dateien aus dem Verzeichnis in die ComboBox
- 22. CVS-Liste der Dateien nur in Arbeitsverzeichnissen
- 23. Anzeige Liste der Dateien im Raster .net Mvc Rasiermesser C#
- 24. Get Liste der Dateien von FTP-Server
- 25. Liste der Abhängigkeit JAR-Dateien in Maven
- 26. C# Ausnahme bei "PUT" - Dateien auf Server
- 27. Eine Liste aller Dateien in einem Verzeichnis in vb.net abrufen
- 28. Dateien in einem Ordner abrufen
- 29. TFS-Befehl für Liste der eingecheckten Dateien
- 30. Liste der ASP.Net MVC "spezielle" Ordner/Dateien
Von dem, was ich verstehe, C# 4.0 sollte dies viel schneller und einfacher machen ;-) – Dested
Sie dies in einer einzigen Zeile tun, ohne die SELECT ** var Dateien = new Directory (@ "C: \ ") .GetFiles(). Wo (x => (x.Attributes & FileAttributes.Hidden) == 0); ** –
Oder einfach nur die Verzeichnisklasse (reduziert @astanders Lösung um 8 Zeichen) var files = Directory.GetFiles (@ "c: \"). Wobei (x => (x.Attributes & FileAttributes.Hidden) == 0); –