Je suis entrain de créer une application de sauvegarde où c# de l'analyse d'un répertoire. Avant je utiliser pour avoir quelque chose comme cela dans le but de récupérer tous les fichiers et sous-fichiers dans un répertoire:
DirectoryInfo di = new DirectoryInfo("A:\\");
var directories= di.GetFiles("*", SearchOption.AllDirectories);
foreach (FileInfo d in directories)
{
//Add files to a list so that later they can be compared to see if each file
// needs to be copid or not
}
Le seul problème avec cela est que, parfois, un fichier ne peut pas être consulté et j'ai plusieurs erreurs. un exemple d'une erreur que je reçois est:
Par conséquent, j'ai créé une méthode récursive qui analyse tous les fichiers dans le répertoire courant. Si là où les répertoires de ce répertoire, puis la méthode sera appelée de nouveau de passage de ce répertoire. La bonne chose à propos de cette méthode est que j'ai pu placer les fichiers à l'intérieur d'un bloc try catch me donnant la possibilité d'ajouter ces fichiers à une Liste si aucun des erreurs et ajouter le répertoire à l'autre liste si j'avais des erreurs.
try
{
files = di.GetFiles(searchPattern, SearchOption.TopDirectoryOnly);
}
catch
{
//info of this folder was not able to get
lstFilesErrors.Add(sDir(di));
return;
}
Si cette méthode fonctionne très bien le seul problème est que lorsque je scanne un grand répertoire, il prend beaucoup de temps. Comment ai-je pu accélérer ce processus? Ma méthode est présent en cas de besoin.
private void startScan(DirectoryInfo di)
{
//lstFilesErrors is a list of MyFile objects
// I created that class because I wanted to store more specific information
// about a file such as its comparePath name and other properties that I need
// in order to compare it with another list
// lstFiles is a list of MyFile objects that store all the files
// that are contained in path that I want to scan
FileInfo[] files = null;
DirectoryInfo[] directories = null;
string searchPattern = "*.*";
try
{
files = di.GetFiles(searchPattern, SearchOption.TopDirectoryOnly);
}
catch
{
//info of this folder was not able to get
lstFilesErrors.Add(sDir(di));
return;
}
// if there are files in the directory then add those files to the list
if (files != null)
{
foreach (FileInfo f in files)
{
lstFiles.Add(sFile(f));
}
}
try
{
directories = di.GetDirectories(searchPattern, SearchOption.TopDirectoryOnly);
}
catch
{
lstFilesErrors.Add(sDir(di));
return;
}
// if that directory has more directories then add them to the list then
// execute this function
if (directories != null)
foreach (DirectoryInfo d in directories)
{
FileInfo[] subFiles = null;
DirectoryInfo[] subDir = null;
bool isThereAnError = false;
try
{
subFiles = d.GetFiles();
subDir = d.GetDirectories();
}
catch
{
isThereAnError = true;
}
if (isThereAnError)
lstFilesErrors.Add(sDir(d));
else
{
lstFiles.Add(sDir(d));
startScan(d);
}
}
}
Ant le problème si j'essaie de gérer l'exception avec quelque chose comme:
DirectoryInfo di = new DirectoryInfo("A:\\");
FileInfo[] directories = null;
try
{
directories = di.GetFiles("*", SearchOption.AllDirectories);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("There was an error with UnauthorizedAccessException");
}
catch
{
Console.WriteLine("There was antother error");
}
Est que si une exception se produit, alors je n'ai pas de fichiers.