Я пытающийся записать программу, которая перемещается по локальной файловой системе с помощью файла конфигурации, содержащего соответствующий filepaths. Мой вопрос - это: Что лучшие практики должны использовать при выполнении файлового ввода-вывода (это будет с настольного приложения на сервер и назад), и навигация файловой системы в C#?
Я знаю, как погуглить, и я нашел несколько решений, но я хотел бы знать, какая из различных функций является самой устойчивой и гибкой. Также, если бы у кого-либо есть какие-либо подсказки относительно обработки исключений для файлового ввода-вывода C#, который также был бы очень полезен.
Вам не нужна отдельная библиотека, используйте классы в пространстве имен System.IO
, например File
, FileInfo
, Справочник
, СправочникИнфо
. Простой пример:
var d = new DirectoryInfo(@"c:\");
foreach(FileInfo fi in d.GetFiles())
Console.WriteLine(fi.Name);
О каких различных библиотеках вы говорите?
Я бы в основном придерживался System.IO.Directory
и подобных. Там есть все, что вам нужно.
Что-то вроде:
foreach (var file in System.IO.Directory.GetFiles(@"C:\Yourpath"))
{
// Do ya thang.
}
В пространстве имен System.IO
можно использовать различные классы, включая File
, FileInfo
, Directory
и DirectoryInfo
.
Что касается практики... как и при любом IO, убедитесь, что вы закрываете все открытые потоки. Вам также может понадобиться использовать объект Disposable
, поэтому изучите ключевое слово using
.
System.IO
- это все, что вам нужно :)
Что касается обработки исключений. Если мы не ожидаем исключения, мы никогда не должны его ловить. Поистине неожиданные исключения не должны обрабатываться. [выглядит виноватым] хорошо, единственное исключение - на самом высоком уровне, и только для целей отчетности, например
// 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 (string[] args)
{
AppDomain.CurrentDomain.UnhandledException +=
CurrentDomain_UnhandledException;
}
private static void CurrentDomain_UnhandledException (
object sender,
UnhandledExceptionEventArgs e)
{
_log.
Fatal (
string.Format (
"Unhandled exception caught by " +
"'CurrentDomain_UnhandledException'. Terminating program.",
e.ExceptionObject);
}
}
Если вы ожидаете исключения, то приемлемо одно из следующих
// example of first option. this applies ONLY when there is a
// well-defined negative path or recovery scenario
public void SomeFunction ()
{
try
{
string 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
}
}
или
// 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
{
string 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
}
}