带选项卡自动完成的用户输入文件路径

hwustrack

我现在接受用户输入文件路径:

Console.WriteLine("Input file path");
string path = Console.ReadLine();

try
{
    data = System.IO.File.ReadAllBytes(path);
}
catch
{
    Console.WriteLine("Invalid file path entered");
    System.Console.ReadKey();
    return 1;
}

但是,如果用户输入错误的路径,他们将不得不再次输入整个内容。我意识到,当用户输入错误时,我的应用程序将立即退出,我可以再次询问,但是我仍然想让用户更轻松地完成此操作。

取而代之的是,我希望当用户在输入路径时使用Tab键时,该路径具有Windows命令行功能的自动完成功能。例如,如果我打开cmd并键入cd C:\win并单击TAB,则cmd将找到C:\ Windows。

是否可以将该功能添加到控制台应用程序中以供用户输入?

马修·金登(Mathieu Guindon)

起初,我认为清除特定的控制台行是不可行的,但是快速搜索显示,没有什么是不可能的

因此,我创建了一个新的控制台应用程序,并开始考虑如何使类似的东西起作用。以下是“第一个工作草案”-我将独自[大量]重构它,然后将生成的代码放在Code Review上,但这应该足以使您入门。

该程序Tab使用字符串数组作为数据,使键自动完成当前输入,并与找到的第一项匹配;如果需要更智能的功能(例如,将当前文件夹的子路径作为数据,和/或在每次连续按下该Tab键时重复进行匹配操作),则必须对其进行一些调整:

class Program
{
    static void Main(string[] args)
    {
        var data = new[]
        {
            "Bar",
            "Barbec",
            "Barbecue",
            "Batman",
        };

        var builder = new StringBuilder();
        var input = Console.ReadKey(intercept:true);

        while (input.Key != ConsoleKey.Enter)
        {
            var currentInput = builder.ToString();
            if (input.Key == ConsoleKey.Tab)
            {
                var match = data.FirstOrDefault(item => item != currentInput && item.StartsWith(currentInput, true, CultureInfo.InvariantCulture));
                if (string.IsNullOrEmpty(match))
                {
                    input = Console.ReadKey(intercept: true);
                    continue;
                }

                ClearCurrentLine();
                builder.Clear();

                Console.Write(match);
                builder.Append(match);
            }
            else
            {
                if (input.Key == ConsoleKey.Backspace && currentInput.Length > 0)
                {
                    builder.Remove(builder.Length - 1, 1);
                    ClearCurrentLine();

                    currentInput = currentInput.Remove(currentInput.Length - 1);
                    Console.Write(currentInput);
                }
                else
                {
                    var key = input.KeyChar;
                    builder.Append(key);
                    Console.Write(key);
                }
            }

            input = Console.ReadKey(intercept:true);
        }
        Console.Write(input.KeyChar);
    }

    /// <remarks>
    /// https://stackoverflow.com/a/8946847/1188513
    /// </remarks>>
    private static void ClearCurrentLine()
    {
        var currentLine = Console.CursorTop;
        Console.SetCursorPosition(0, Console.CursorTop);
        Console.Write(new string(' ', Console.WindowWidth));
        Console.SetCursorPosition(0, currentLine);
    }
}

感谢您提出这个问题,这很有趣!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带输入广播的CSS选项卡系统(无js)

来自分类Dev

用户输入-路径自动完成

来自分类Dev

在Intellij中关闭自动完成选项卡删除

来自分类Dev

如何使bash停止选项卡自动完成隐藏目录

来自分类Dev

如何使bash停止选项卡自动完成隐藏目录

来自分类Dev

选项卡自动完成“命令替换错误”

来自分类Dev

自动完成弹出框内的Material-UI选项卡

来自分类Dev

获取intellij python以在选项卡上自动完成而不是在空格(和选项卡)上自动完成

来自分类Dev

在输入任务实现中过滤选项卡完成

来自分类Dev

文件夹中参数的命令选项卡完成

来自分类Dev

带“路径”选项卡的“角材料路径”对话框

来自分类Dev

Bash / zsh选项卡的自动完成功能:给定初始命令,请忽略具有自动完成功能的目录中的某些文件

来自分类Dev

自动引导选项卡

来自分类Dev

文本文件输入忽略选项卡行

来自分类Dev

选项卡自动补全命令的选项

来自分类Dev

bash选项卡补全(带空格)

来自分类Dev

带CodeMirror的引导选项卡

来自分类Dev

带边框的选项卡菜单

来自分类Dev

定义要在多个完成文件(zsh)中使用的选项卡完成帮助器功能

来自分类Dev

符号名称的LLDB选项卡完成

来自分类Dev

jQuery终端选项卡完成

来自分类Dev

zsh选项卡完成。到 。/

来自分类Dev

目录的vim选项卡完成

来自分类Dev

禁用腻子选项卡完成声音

来自分类Dev

取消zsh选项卡完成

来自分类Dev

禁用bash选项卡完成

来自分类Dev

取消zsh选项卡完成

来自分类Dev

LLDB选项卡完成的符号名称

来自分类Dev

zsh选项卡完成。到 。/