Что самый легкий путь состоит в том, чтобы циклично выполнить через папку файлов в C#?

Я пытающийся записать программу, которая перемещается по локальной файловой системе с помощью файла конфигурации, содержащего соответствующий filepaths. Мой вопрос - это: Что лучшие практики должны использовать при выполнении файлового ввода-вывода (это будет с настольного приложения на сервер и назад), и навигация файловой системы в C#?

Я знаю, как погуглить, и я нашел несколько решений, но я хотел бы знать, какая из различных функций является самой устойчивой и гибкой. Также, если бы у кого-либо есть какие-либо подсказки относительно обработки исключений для файлового ввода-вывода C#, который также был бы очень полезен.

5
задан tshepang 11 November 2014 в 13:09
поделиться

4 ответа

Вам не нужна отдельная библиотека, используйте классы в пространстве имен System.IO , например File , FileInfo , Справочник , СправочникИнфо . Простой пример:

var d = new DirectoryInfo(@"c:\");
foreach(FileInfo fi in d.GetFiles())
    Console.WriteLine(fi.Name);
9
ответ дан 18 December 2019 в 10:42
поделиться

О каких различных библиотеках вы говорите?

Я бы в основном придерживался System.IO.Directory и подобных. Там есть все, что вам нужно.

Что-то вроде:

foreach (var file in System.IO.Directory.GetFiles(@"C:\Yourpath"))
{
    // Do ya thang.
}
3
ответ дан 18 December 2019 в 10:42
поделиться

В пространстве имен System.IO можно использовать различные классы, включая File, FileInfo, Directory и DirectoryInfo.

Что касается практики... как и при любом IO, убедитесь, что вы закрываете все открытые потоки. Вам также может понадобиться использовать объект Disposable, поэтому изучите ключевое слово using.

2
ответ дан 18 December 2019 в 10:42
поделиться

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
    }
}
2
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: