Основная проблема в том, что вы сохраняете значение string
в словаре, а не в самой функции, поэтому, когда вы добавляете функции, вы добавляете их немедленное возвращаемое значение (прежде чем вы когда-либо предложите пользователю ввести данные).
Вместо этого значение словаря должно быть Func<string>
, которое вы можете затем .Invoke
по требованию.
Кроме того, казалось, что вы не проверяли запись пользователя. Мы можем использовать TryGetValue
для ввода пользователя, чтобы убедиться, что он ввел правильную команду (если она существует в словаре). Если это не так, мы можем сказать им, что их ввод неверен.
Кроме того, при доступе к значениям массива вы должны сначала убедиться, что индекс, к которому вы обращаетесь, действителен (если пользователь вводит только одну команду,как "lf"
без значения, то вы не можете получить доступ к индексу массива [1]
, потому что он не существует.
Кроме того, похоже, что даже когда пользователь вводит путь, вы сохраняете его вvalue
, но никогда не используйте его. Поэтому я изменил методы ListFiles
и ListDirectories
, чтобы рассматривать значение как путь, и, если оно существует, перечислять файлы или каталоги по указанному пути.
Попробуйте этот код с изменениями:
public class Program
{
private static DirectoryInfo _maindirectory = new DirectoryInfo("C:\\Users");
private static Dictionary<string, Func<string>> _keyaction =
new Dictionary<string, Func<string>>
{
{"lf", ListFiles},
{"ld", ListDirectories},
{"cd", ChangeDirectory},
{"exit", Exit}
};
private static string _value;
private static void DisplayPrompt(FileSystemInfo directory)
{
Console.Write($"{directory?.FullName ?? "[cmd]"}: ");
}
private static void ProcessAnswer(IReadOnlyList<string> array)
{
var action = array.Count > 0 ? array[0] : string.Empty;
_value = array.Count > 1 ? array[1] : null;
Func<string> method;
_keyaction.TryGetValue(action, out method);
if (method == null)
{
WriteError($"Unknown command: {action}");
}
else
{
Console.WriteLine(_keyaction[action].Invoke());
}
}
private static string ListFiles()
{
var dir = Directory.Exists(_value) ? new DirectoryInfo(_value) : _maindirectory;
foreach (var file in dir.GetFiles())
{
Console.WriteLine(file.Name);
}
return "ok";
}
private static string ListDirectories()
{
var dir = Directory.Exists(_value) ? new DirectoryInfo(_value) : _maindirectory;
foreach (var directory in dir.GetDirectories())
{
Console.WriteLine(directory);
}
return "ok";
}
private static string ChangeDirectory()
{
if (Directory.Exists(_value))
{
_maindirectory = new DirectoryInfo(_value);
}
else if (Directory.Exists(Path.Combine(_maindirectory.FullName, _value)))
{
_maindirectory = new DirectoryInfo(
Path.Combine(_maindirectory.FullName, _value));
}
else
{
WriteError("Directory not found.");
}
return "ok";
}
private static void WriteError(string message)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(message);
Console.ResetColor();
}
private static string Exit()
{
Environment.Exit(0);
return "ok";
}
private static void Main()
{
while (true)
{
DisplayPrompt(_maindirectory);
ProcessAnswer(Console.ReadLine()?.Split(' '));
}
}
}