Hallo zusammen,
hier mal eine Methode, wie man einen Ordner mit grossen Datenmengen schnell und Performant auslesen kann.
Getestet habe ich mit deinem Datensatz von ca. 83 GB und ca. 45000 Files (meistens Image-, PDF- und Officedateien).
Als erstes hatte ich folgende Methode versucht, die ich im Netz gefunden hatte, damit habe ich einige Tests gemacht, bin aber damit nicht unter 8 Sekunden gekommen.
private IEnumerable<string> GetFiles(string path)
{
Queue<string> queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0)
{
path = queue.Dequeue();
try
{
if (Directory.Exists(path))
{
foreach (string subDir in Directory.GetDirectories(path))
{
if (Directory.GetDirectories(path).Contains("Neuer Ordner 3"))
{
Console.Error.WriteLine(path);
}
if (Directory.Exists(path))
{
bool isHidden = (File.GetAttributes(subDir) & FileAttributes.Hidden) == FileAttributes.Hidden;
if (!isHidden)
{
queue.Enqueue(subDir);
}
}
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
string[] files = null;
try
{
if (Directory.Exists(path))
{
files = Directory.GetFiles(path);
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
if (files != null)
{
for (int i = 0; i < files.Length; i++)
{
bool isHidden = (File.GetAttributes(files[i]) & FileAttributes.Hidden) == FileAttributes.Hidden;
if (!isHidden)
{
numberOfFilesAndDirs++;
yield return files[i];
}
}
}
}
}
private IEnumerable<string> GetDirectories(string path)
{
Queue<string> queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0)
{
path = queue.Dequeue();
try
{
if (Directory.Exists(path))
{
foreach (string subDir in Directory.GetDirectories(path))
{
if (Directory.GetDirectories(path).Contains("Neuer Ordner 3"))
{
Console.Error.WriteLine(path);
}
if (Directory.Exists(path))
{
bool isHidden = (File.GetAttributes(subDir) & FileAttributes.Hidden) == FileAttributes.Hidden;
if (!isHidden)
{
queue.Enqueue(subDir);
}
}
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
string[] files = null;
try
{
if (Directory.Exists(path))
{
files = Directory.GetDirectories(path);
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
if (files != null)
{
for (int i = 0; i < files.Length; i++)
{
bool isHidden = (File.GetAttributes(files[i]) & FileAttributes.Hidden) == FileAttributes.Hidden;
if (!isHidden)
{
numberOfFilesAndDirs++;
yield return files[i];
}
}
}
}
}Code-Sprache: PHP (php)
Als ich feststellen musste, das ich nicht unter 8 Sekunden kam, habe ich mir im Netz noch andere Methoden angeschaut und habe noch einige getestet und die Methode mit der besten Performence war dann die folgende, mit dieser Methode konnte ich die Ladezeit auf ca. 0,8 Sekunden optimieren.
// get level 1 files and directories
List<string> liste2 =
Directory.EnumerateFileSystemEntries(path)
.Where(x => !blockList.Any(z => x == z) && !new FileInfo(x).Attributes.HasFlag(FileAttributes.Hidden))
.Select(x => { return replaceMainDir(x); }).ToList();
// get other files and directories
DirectoryInfo root = new DirectoryInfo(path);
List<string> liste1 =
root.EnumerateDirectories()
.AsParallel()
.SelectMany(d => d.EnumerateFileSystemInfos("*.*", SearchOption.AllDirectories)
.OrderBy(y => y.CreationTime)
.Where(x => !blockList.Any(z => x.FullName == z) && !x.Attributes.HasFlag(FileAttributes.Hidden)))
.Select(x => { return replaceMainDir(x.FullName); })
.ToList();
// create one list
List<string> list0 = new List<string>();
list0 = list0.Concat(liste1).Concat(liste2).ToList();Code-Sprache: JavaScript (javascript)