C# Console.ReadLine()而不按Enter键

C# Console.ReadLine()而不按Enter键,c#,C#,当我使用: string fileName = Console.ReadLine(); 用户必须删除该项,然后按Enter键。 我希望我的控制台应用程序的用户能够将一个文件拖放到控制台应用程序窗口中,并获取该文件的名称,而无需在每次拖放项目时按Enter键,因为他必须拖放一堆项目 文件扩展名是.xlsx和.py。当ReadLine遇到这些子字符串时,有没有办法告诉它停止读取?正如我所知,对于这种情况,除了制作自己的GUI之外,没有真正好的解决方案。C#控制台无法从文件删除接收事件,因为csrs

当我使用:

string fileName = Console.ReadLine();
用户必须删除该项,然后按Enter键。 我希望我的控制台应用程序的用户能够将一个文件拖放到控制台应用程序窗口中,并获取该文件的名称,而无需在每次拖放项目时按Enter键,因为他必须拖放一堆项目


文件扩展名是.xlsx和.py。当ReadLine遇到这些子字符串时,有没有办法告诉它停止读取?

正如我所知,对于这种情况,除了制作自己的GUI之外,没有真正好的解决方案。C#控制台无法从文件删除接收事件,因为
csrss.exe
拥有该窗口,而不是您的应用程序

下一个解决方案在很多情况下都不起作用,但如果这只是测试功能,而不是生产功能,我认为这就足够了

    static void Main(string[] args)
    {
        StringBuilder fileNameBuilder = new StringBuilder();
        ConsoleKeyInfo cki = new ConsoleKeyInfo();

        do
        {
            while (Console.KeyAvailable == false)
                Thread.Sleep(250); 
            cki = Console.ReadKey(true);
            fileNameBuilder.Append(cki.KeyChar);
        } while (!fileNameBuilder.ToString().EndsWith(".xlsx") || !fileNameBuilder.ToString().EndsWith(".py"));

        var fileName = fileNameBuilder.ToString();
    }

正如我所知,对于这种情况,除了制作自己的GUI之外,没有真正好的解决方案。C#控制台无法从文件删除接收事件,因为
csrss.exe
拥有该窗口,而不是您的应用程序

下一个解决方案在很多情况下都不起作用,但如果这只是测试功能,而不是生产功能,我认为这就足够了

    static void Main(string[] args)
    {
        StringBuilder fileNameBuilder = new StringBuilder();
        ConsoleKeyInfo cki = new ConsoleKeyInfo();

        do
        {
            while (Console.KeyAvailable == false)
                Thread.Sleep(250); 
            cki = Console.ReadKey(true);
            fileNameBuilder.Append(cki.KeyChar);
        } while (!fileNameBuilder.ToString().EndsWith(".xlsx") || !fileNameBuilder.ToString().EndsWith(".py"));

        var fileName = fileNameBuilder.ToString();
    }

我知道的唯一方法是拖动程序的.exe文件上的文件,然后从
args[]
(传递到
main
)读取它们的名称,然后像加载C#中的任何文件一样加载它们


另一种方法是使用GUI,在这种情况下,您可以添加
DragEventHandler
对象来处理拖放事件。(还有数据)。

我知道的唯一方法是拖动程序的.exe文件上的文件,然后从
args[]
(传递到
main
)读取它们的名称,然后像加载C#中的任何文件一样加载它们

另一种方法是使用GUI,在这种情况下,您可以添加
DragEventHandler
对象来处理拖放事件。(还有数据)。

使用Console.ReadKey()循环,提取返回的字符

var filename = "";
do
{
    filename+= Console.ReadKey().KeyChar;

} while (!(filename.StartsWith("\"") && filename.EndsWith(".xlsx\"")) 
       && filename.EndsWith(".xlsx")); //continue with other extension
请注意结尾处的双引号,因为如果有空格,您将得到包含文件名的引号。如果文件名中间有xxsx,则会中断。

带控制台.Read键()的循环,提取返回的字符。

var filename = "";
do
{
    filename+= Console.ReadKey().KeyChar;

} while (!(filename.StartsWith("\"") && filename.EndsWith(".xlsx\"")) 
       && filename.EndsWith(".xlsx")); //continue with other extension

请注意结尾处的双引号,因为如果有空格,您将得到包含文件名的引号。如果文件名中间有XLSX,则会中断。

循环使用控制台。虽然在这种情况下,如果有人将其文件命名为blah.xlsxBlah.py,您可能会出错,您可能最好创建一个UI应用程序来正确处理此问题。您可以循环Console.Read,并在后台设置一个计时器,在几毫秒内检测是否有新字符出现。仍然有点不稳定,所以。使用Console.Read()循环,在获得扩展时中断?虽然在这种情况下,如果有人将其文件命名为blah.xlsxBlah.py,您可能会出错,您可能最好创建一个UI应用程序来正确处理此问题。您可以循环Console.Read,并在后台设置一个计时器,在几毫秒内检测是否有新字符出现。仍然有点动摇,所以不会有任何。XLSX在中间,所以这个解决方案工作完美。谢谢。中间没有XXLSX,所以这个解决方案工作得很好。非常感谢。