Пример для пользовательского меню замены файла

#c# #directory

#c# #каталог

Вопрос:

У меня есть приложение, которое записывает файлы из каталога. Это программное обеспечение может читать только 1 файл или несколько из них, например:

 Case 1:  "file_1.dat"
Case 2: "file_1.dat", "file_2.dat", "file_3.dat"...etc
  

Я создаю это, показывает это сообщение, если файл существует в каталоге. Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь пишет «N», а программе требуется продолжить чтение других файлов, я не знаю, как продолжает задавать тот же вопрос и не отменяет процесс, если пользователь пишет «N». Мне нужно, чтобы программа продолжала тот же процесс, обычно проверяя, существуют ли другие файлы. Итак, как я могу сделать?

 if (File.Exists(binaryFilePath))
            {
                Program.DisplayUserOptionMessage("The file: "   binaryFileName   " exist. You want to overwrite it? Y/N");
                //string overwrite = Console.ReadLine();
                 while (true)
                 {
                    string overwrite = Console.ReadLine();
                    if (overwrite.ToUpper() == "Y")
                    {
                       WriteBinaryFile(frameCodes, binaryFilePath);
                       break;
                    } 
                    else if (overwrite.ToUpper() == "N")
                    {

                        //Program.DisplayExceptionMessage("apply this for all the rest?? ");
                        throw new IOException();                        
                    } 
                    else
                    {
                    Program.DisplayUserOptionMessage("!!Please Select a Valid Option!!");
                    overwrite = Console.ReadLine();
                    continue;
                    } 
                }
            }
  

Ответ №1:

Похоже, что имеющийся у вас фрагмент кода вызывается циклом, который обрабатывает файлы. Я бы предположил, что IOException то, что вы бросаете, вышвырнет вас из этого цикла… не уверен, зачем вам это нужно, поскольку на самом деле это не исключение?

Лучше всего перехватить это исключение в цикле, который обрабатывает файлы, обработать его (записать в журнал или продолжить) и перейти к следующему элементу цикла.

Другой вариант — просто «вернуть» вместо того, чтобы выбрасывать IOException .

Я думаю, у вас есть еще один небольшой сбой, если пользователь вводит недопустимое значение, вы дважды запросите у него действительное. Отбросьте overwrite = Console.ReadLine(); в else{...} цикле … вы выполняете этот вызов в начале следующего цикла.

Ответ №2:

Я не думаю, что вам нужен этот while (true) цикл. Скорее while (!isFileProcessed) (подробнее об этом чуть позже). Я предполагаю, что вы перебираете имена входных файлов, если это так, то можно спросить «Файл существует. Вы хотите перезаписать его? Y / N « вопрос для каждого файла.

Однако ваша программа, вероятно, должна быть структурирована по-другому:

 string[] filesNames = new[] { "file_1.dat", "file_2.dat", "file_3.dat" };
foreach (var name in filesNames)
{  
    // ... 

    if (binaryExists)
    {
        bool isFileProcessed = false;
        Program.DisplayUserOptionMessage("The file: "   binaryFileName 
              " exist. You want to overwrite it? Y/N");
        while (!isFileProcessed)
        {
            string overwrite = Console.ReadLine();
            if (overwrite.ToUpper() == "Y")
            {
                WriteBinaryFile(frameCodes, binaryFilePath);
                isFileProcessed = true; 
            }
            else if (overwrite.ToUpper() == "N")
            {
                isFileProcessed = true; 
            } 
            else
            {
                // here we do nothing with isFileProcessed flag: 
                // user still needs to select proper option, loop continues 
                Program.DisplayUserOptionMessage(
                    "!!Please Select a Valid Option!!");
            }
        } 
     }
 }
  

Комментарии:

1. Я сам предпочитаю использовать переменную, подобную этой, вместо while (true)… преимущество continue и break в том, что они немедленно выводятся из цикла … если бы у него был код после else, который должен выполняться только в том случае, если файл не был обработан, ему пришлось бы продолжить или прервать (например, если не было третьего else , просто сообщение пользователю). Хотя я согласен с тем, как это написано, использование переменной цикла лучше.