本文共 2765 字,大约阅读时间需要 9 分钟。
昨天学习了C#的语法,觉得这个语言相比c、c++较为简单,和JAVA有相似之处,在VS上写代码体验很不错。
C#有很多Windows的API可供调用,其中比如查找目录及文件,操作很方便。由此想到一个小程序的点子:
因为平时会记录一些简短的笔记,比如SQL语句、HTML语句、LINUX的SHELL语句,有时候要用想要去查,翻书或者翻笔记什么的都太慢而且分心,想到可以把记录放到一个文件里,然后使用cmd调用程序搜索文件内容,找到对应行直接输出。
比如:
使用mmm程序,对文件名含有sql的文件夹搜索“查询”字符串
建立一个类,包含要查询的路径,输入参数的内容。
主要使用的类型有:DirectoryInfo,可以获取目录信息,得到目录下的文件夹名和文件名。FileInfo,可以获取文件信息。
查询函数使用如下递归子函数进行:
public void search(string[]str) { DirectoryInfo dir = new DirectoryInfo(find_path); name = str[0]; content = new string[str.Length-1]; for (int i = 1; i < str.Length; i++) { content[i - 1] = str[i]; } recur(dir); }
void recur(DirectoryInfo dir) { FileInfo[] files = dir.GetFiles(); DirectoryInfo[] dr = dir.GetDirectories(); foreach (DirectoryInfo d in dr) { recur(d); } foreach (FileInfo f in files) { string fname = f.Name; if (fname.Contains(name)) { string str; //addcontent(dir.FullName + @"\" + fname); StreamReader fread = new StreamReader(dir.FullName+@"\"+fname,Encoding.UTF8); while((str = fread.ReadLine())!= null) { foreach (string s in content) { if (count == 100) return; if (str.Contains(s)) { ans[count++] = str; break; } } } fread.Close(); } } }在建立的Searcher类中,使用这个函数进行查找,然后调用显示结果的子函数,通过判断count,决定输出。
主函数如下:
static void Main(string[] args) { Searcher sche = new Searcher(); if (args.Length > 0) { sche.search(args); sche.showans(); } else { return; } }目前Searcher有一个功能,就是查找内容。现在如果改变需求,要做添加内容的功能,生成另外一个程序,那么要对它进行大改吗?不需要。
C#对于改变需求的情况做了很多特性支持,比如接下来使用的这种Conditional特性。
[Conditional("write_to_file")] public void addcontent(string path) { StreamWriter wt = new StreamWriter(path,true); foreach (string str in content) { wt.WriteLine(str); } wt.Close(); Console.WriteLine("已写入."); count++; }如果有宏定义write_to_file,那么addcontent函数就会被编译并且调用,否则不会被调用。加上这句说明,再在之前的递归函数里添加一句(就是之前注释掉的那一行),就可以通过定义宏来选择功能。
总结:
C#对Windows的操作很方便,抛弃对指针的直接使用(要使用需要在unsafe下),虽然只学了一点皮毛的皮毛,还没有体会在WPF中以及web开发的应用,已经能感受到其特点。
转载地址:http://ktqws.baihongyu.com/