#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
, просто сообщение пользователю). Хотя я согласен с тем, как это написано, использование переменной цикла лучше.