C#解决在控制台中输入Ctrl+Z的问题

本人在前几天做了一道题如下(在116行中用(int)cki.KeyChar==26解决了C#中在控制台捕捉Ctrl+Z):

解决的方法也是请教了老师,经老师调试过才得出的解决方法.(因在ConsoleKey的枚举中无Ctrl此键)

总结的心得是,单步调试方法确实是有效解决问题的路径.

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace 用CSharp实现DOS命令Copy_con
6 {
7  //24、编写一个程序,模拟DOS系统中的COPY CON命令功能。
8  /**//*copy是复制命令,不多解释。
9 con 是dos 设备文件的简称。 在dos中把很多外部设备作为文件,称为设备文件。
10 dos中这样规定的:con 控制台(键盘/显示器) aux (或com1)第一个串口 lpt1 第一个并行打印机接口,
11 nul 不存在的设备
12  所以,举例说明:
13 copy con abc.txt
14 这条命令的意思就是从键盘中把输入的文字复制到文件abc.txt中去,所以输入命令后,在输入字符,结束时按下
15 ctrl+z.你输入的文字就会保存到abc.txt这个文件里了。
16 而如果你输入的是
17 copy abc.txt con
18 计算机则会把abc.txt中的文字复制到屏幕上,也就是显示出来
19   */
20  class DOSCopyCon
21  {
22    private string inputCommandtext="";
23
24    private string sourceFilename="";
25
26    private string targetFilename="";
27    //有参构造函数实现,实例化对象的同时赋值命令字符串
28    public DOSCopyCon(string inputCommandText)
29    {
30      this.inputCommandtext = inputCommandText;
31    }
32    //读写属性InputCommandText实现输入或读取命令字符串
33    public string InputCommandText
34    {
35      get
36      {
37        return inputCommandtext;
38      }
39      set
40      {
41        if (value != "")
42        {
43          this.inputCommandtext = value;
44        }
45      }
46    }
47    //只读属性SourceFileName
48    public string SourceFileName
49    {
50      get
51      {
52        return sourceFilename;
53      }
54    }
55    //只读属性TargetFileName
56    public string TargetFileName
57    {
58      get
59      {
60        return targetFilename;
61      }
62    }
63    //有参执行copy con命令方法
64    public void ExecuteCopyConCommand(string inputCommandText)
65    {
66      if (inputCommandText != "")
67      {
68        this.inputCommandtext = inputCommandText;
69        //开始实现Copy命令
70        DoneCopyCon();
71      }
72      else
73      {
74        Console.WriteLine("**Copy命令不能为空**");
75        return;
76      }
77    }
78    //无参执行copy con 方法
79    public void ExecuteCopyConCommand()
80    {
81      if (inputCommandtext == "")
82      {
83        Console.WriteLine("**Copy命令不能为空**");
84        return;
85      }
86      //开始实现Copy命令
87      DoneCopyCon();
88    }
89
90    //实现Copy命令的方法
91    private void DoneCopyCon()
92    {
93      //ConsoleKeyInfo ckis=new ConsoleKeyInfo(Convert.ToChar("\x001A"),ConsoleKey.Z,false,true,false);
94      ConsoleKeyInfo cki = new ConsoleKeyInfo();
95      
96      String[] strs = inputCommandtext.Split(new char[] { ' ' });
97      string inputFileText = "";
98
99      if (strs.Length > 3 || strs[0] != "copy")//输入命令字符串不合法
100      {
101        Console.WriteLine("您输入的copy命令不正确!!");
102        return;
103      }
104
105      else
106      {
107        if (strs[1] == "con")  //从控制台中接收字符串写入文件中
108        {
109      //*******************
110          //因ConsoleKey枚举中没有Ctrl键的值,但注意可用单步调试的方法来,查看在控制台中输入Ctrl+Z的值是多少
111          //在单步调试的调试状态下,输入Ctrl+Z得知cki.KeyChar的值是26,于是我们可以利用这一值来进行转换比较即可
112          Console.WriteLine("开始往文件{0}写入字符串(按Ctrl+Z或End结束并写入):",strs[2]);
113          while (true)
114          {
115            cki = Console.ReadKey();
116            if (cki.Key == ConsoleKey.End||(int)cki.KeyChar==26) //只实现了按End建就结束并写入文件
117            {                //但Ctrl+Z还没实现
118              break;
119            }
120            inputFileText += cki.KeyChar.ToString();
121          }
122          System.IO.StreamWriter sw = new System.IO.StreamWriter(strs[2]);
123          sw.Write(inputFileText);
124          sw.Close();
125          Console.WriteLine("写入文件{0}成功.", strs[2]);
126          return;
127        }
128       //*******************
129        else
130        {
131          if (strs[2] == "con")  //若是读文件命令
132          {
133            Console.WriteLine("开始读取文件{0}",strs[1]);
134            Console.WriteLine("读取文件成功,此文件内容如下:");
135            System.IO.StreamReader sr = new System.IO.StreamReader(strs[1]);
136            Console.WriteLine(sr.ReadToEnd());
137            Console.WriteLine("读取文件已完成.");
138            sr.Close();
139            return;
140          }
141          //以下操作为复制文件时用到
142          //else //开始复制操作
143          //{
144          //  this.sourceFilename = strs[1];
145          //  this.targetFilename = strs[2];
146
147          //  if (strs[1] == strs[2])  //若同名复制就不管了
148          //  {
149          //    Console.WriteLine("同名复制!!");
150          //    return;
151          //  }
152          //  else  //开始复制异名文件
153          //  {
154          //    if (System.IO.File.Exists(strs[2])) //目标文件存在就删除
155          //    {
156          //      Console.Write(string.Format("您要改写文件{0}吗?(Yes/NO/All):", strs[2]));
157          //      string dialogResultStr = Console.ReadLine();
158          //      if
159          //      System.IO.File.Delete(strs[2]);
160          //    }
161          //    System.IO.File.Copy(strs[1], strs[2]);//开始复制文件
162          //    Console.WriteLine("复制源文件{0}到目标文件{1}成功!",strs[1], strs[2]);
163          //  }
164          //}
165        }
166      }
167    }
168  }
169}

时间: 2024-11-02 12:04:25

C#解决在控制台中输入Ctrl+Z的问题的相关文章

Java如何从控制台中读取数据

  从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流.有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增加一个版本号,就有一种新增的方法,这也增加了选择的种类,可以依据不同的要求来进行选择.下面来看一下,各个版本中如何从控制台中读取数据以及各自的优缺点. 1 JDK 1.4 及以下版本读取的方法 JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in获得系统的输入流,再桥

malloc-C语言,请问这代码哪里错了 在新行按ctrl+z没办法终止输入

问题描述 C语言,请问这代码哪里错了 在新行按ctrl+z没办法终止输入 printf("请输入单链表的数据: "); list = LinkedListCreatT(); for (start = list->next; start != NULL; start = start->next) printf("%d",start->data); printf("n"); LinkedList LinkedListCreatT()

用java实现像linux命令一样在Eclipse控制台中可以输入规定范围内的命令,并显示命令对应的正确内容。

问题描述 最近有一个考题(由于题目在公司拿不出来只有大概介绍一下了),考题附带了一个input.jar包,jar包中input.xml文件的元素(或是文本节点)是实际在Eclipse控制台中可以输入的命令,如果输入这些命令将会显示命令对应的内容.加入该xml有如下命令,addd:softinput.jar---加载成功/加载失败/没有该文件(这是输入该命令后输入的几种结果).removeinput.jar---删除jar包.listinfo----显示jar包中指定的信息(该信息配置在xml中需

C#如何从控制台中读取密码

语言: C# 在登陆Linux系统的时候,体验过在Linux的shell命令行窗口中输入用户密码吗? 下面体验下在Windows控制台中输入密码的方式 Showing  Effect /// <summary> /// Read password from console /// </summary> /// <returns>password</returns> public static string ReadPassword() { char[] re

如何解决JOB的Interval输入参数过长

本文根据一段错误代码从而来分析如何解决JOB的Interval输入参数过长的问题. 给出的运行JOB的PL/SQL代码为: DECLARE job BINARY_INTEGER := :job; next_date DATE := :mydate; broken BOOLEAN := FALSE; BEGIN WHAT :mydate := next_date; IF broken THEN :b := 1; ELSE :b :=0; END IF; END; 并说明了如何使用NEXT_DATE

spring-C# 控制台中把字符串转为ipaddress总是异常

问题描述 C# 控制台中把字符串转为ipaddress总是异常 不知道为什么呀...本人超级新手一个..环境是VS2012NET3.5 解决方案 重新创建下项目看看,没看出什么问题.根据提示是配置文件的问题,可是这也没什么好配置的. 解决方案二: 刚才试了...只有在net 4.0 以上才不会异常同样的只有两条代码..谢谢热心人士 解决方案三: 我也遇到了该问题请问是怎么回事?怎么解决的?没看明白谢谢

java关于怎么在控制台中重复弹出要选择的功能,麻烦大家了!

问题描述 java关于怎么在控制台中重复弹出要选择的功能,麻烦大家了! public static void main(String[] args) { System.out.println("注册(A) 登录(B)"); Scanner sc=new Scanner(System.in); String a="a"; String b="b"; String str=sc.next(); if(str.equalsIgnoreCase(a)){

控制台输出-在Eclipse控制台中监听用户的键盘事件

问题描述 在Eclipse控制台中监听用户的键盘事件 最近在用java编写模拟一个人力资源管理系统,是在控制台实现的.其中有某个功能需要用户输入日期.日期是年月日一起输入的,我想在用户输完年份之后,控制台自动为用户打印出一个短横杠帮助用户输入月份.但是前提是用户还没有按下回车.怎样在用户键盘输入的过程中监听到用户目前已经输入几个字符?有没有大神给点建议. 解决方案 http://www.codeweblog.com/%E5%9C%A8javascript%E4%B8%AD%E7%9B%91%E5

由Ctrl+Z引发的系统卡死重启问题分析

起因 JT同学拿着手机来找我说用着用着自动重启了,让我看一下,我抓出bugreport一看是system server发生watchdog重启了,然后接着看了一下traces,发现traces比较诡异. 初步分析 为什么说traces诡异?暂且一看 都被thread 31持有的锁给block了,那就看看thread 31在搞什么飞机? "InputDispatcher" prio=10 tid=31 Native | group="main" sCount=1 ds