Quel est le moyen le plus simple de parcourir en boucle un dossier de fichiers en C #?

J’essaie d’écrire un programme qui navigue dans le système de fichiers local à l’aide d’un fichier de configuration contenant les chemins de fichiers pertinents. Ma question est la suivante: quelles sont les meilleures pratiques à suivre pour effectuer des E / S sur les fichiers (à partir de l’application de bureau vers un serveur et inversement) et la navigation du système de fichiers en C #?

Je sais comment utiliser Google et j’ai trouvé plusieurs solutions, mais j’aimerais savoir laquelle des différentes fonctions est la plus robuste et la plus flexible. De même, si vous avez des conseils concernant la gestion des exceptions pour les E / S de fichiers C #, cela serait également très utile.

Vous n’avez pas besoin d’une bibliothèque distincte, utilisez les classes de l’espace de noms System.IO telles que File , FileInfo , Directory , DirectoryInfo . Un exemple simple:

 var d = new DirectoryInfo(@"c:\"); foreach(FileInfo fi in d.GetFiles()) Console.WriteLine(fi.Name); 

De quelles bibliothèques parlez-vous?

Je voudrais bien coller à System.IO.Directory et autres. Il a tout ce dont vous avez besoin.

Quelque chose comme:

 foreach (var file in System.IO.Directory.GetFiles(@"C:\Yourpath")) { // Do ya thang. } 

Il existe diverses classes que vous pouvez utiliser dans l’espace de noms System.IO , notamment File , FileInfo , Directory et DirectoryInfo .

En ce qui concerne les pratiques … comme pour tout IO, assurez-vous de fermer tous les stream que vous ouvrez. Vous devrez peut-être également utiliser un object Disposable Consultez le mot-clé using .

System.IO est tout ce dont vous avez besoin 🙂

En ce qui concerne la gestion des exceptions. À moins d’ attendre une exception, nous ne devrions jamais l’attraper. Les exceptions vraiment inattendues ne doivent pas être gérées. [semble coupable] ok, la seule exception est au plus haut niveau, et uniquement à des fins de rapport, comme

 // assuming console program, but every application Console, WinForm, // Wpf, WindowsService, WebService, WcfService has a similar entry point class Program { // assume log4net logging here, but could as easily be // Console.WriteLine, or hand rolled logger private static readonly ILog _log = LogManager.GetLogger (typeof (Program)); static void Main (ssortingng[] args) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; } private static void CurrentDomain_UnhandledException ( object sender, UnhandledExceptionEventArgs e) { _log. Fatal ( ssortingng.Format ( "Unhandled exception caught by " + "'CurrentDomain_UnhandledException'. Terminating program.", e.ExceptionObject); } } 

Si vous attendez une exception, l’une des conditions suivantes est acceptable

 // example of first option. this applies ONLY when there is a // well-defined negative path or recovery scenario public void SomeFunction () { try { ssortingng allText = System.IO.File.ReadAllText (); } // catch ONLY those exceptions you expect catch (System.ArgumentException e) { // ALWAYS log an error, expected or otherwise. _log.Warn ("Argument exception in SomeFunction", e); // if the use-case\control flow is recoverable, invoke // recovery logic, preferably out of try-catch scope } } 

ou

 // example of second option. this applies ONLY when there is no // well defined negative path and we require additional information // on failure public void SomeFunction () { try { ssortingng allText = System.IO.File.ReadAllText (); } // catch ONLY those exceptions you expect catch (System.ArgumentException innerException) { // do whatever you need to do to identify this // problem area and provide additional context // like parameters or what have you. ALWAYS // provide inner exception throw new SomeCustomException ( "some new message with extra info.", maybeSomeAdditionalContext, innerException); // no requirement to log, assume caller will // handle appropriately } }