好久没写文章了。突然怀念以前写文章的时候。碰巧我刚刚放假回家。于是乎我又开始了新一轮的在家研究。这一次的研究主题是:利用C语言与batch实现简单的文件目录管理。具体代码如下所示:
10年积累的网站制作、网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计制作后付款的网站建设流程,更有铁西免费网站建设让你可以放心的选择与我们合作。#include#include#includevoid listfiles();
void changefile(char *oldn,char *newn);
void deletefile(char *del);
void createfile(char *mk);
int main()
{
while(1)
{
int op;
printf("1:查看目录 2:更改目录 3:删除目录 4:增加目录 5:退出\n");
printf("请输入操作选项:");
scanf("%d",&op);
switch(op)
{
case 1:
{
listfiles();
break;
}
case 2:
{
char *o,*n,old1[20],new1[20];
printf("请输入旧目录的名称:\n");
scanf("%s",old1);
printf("请输入新目录的名称:\n");
scanf("%s",new1);
o=old1;
n=new1;
changefile(o,n);
break;
}
case 3:
{
char *d,del[20];
printf("请输入要删除的目录名称:\n");
scanf("%s",del);
d=del;
deletefile(d);
break;
}
case 4:
{
char *m,mk[20];
printf("请输入要创建的目录名称:\n");
scanf("%s",mk);
m=mk;
createfile(m);
break;
}
case 5:
{
system("taskkill /IM operate_files.exe /f");
break;
}
}
}
return 0;
}
void listfiles()
{
system("dir");
}
void changefile(char *oldn,char *newn)
{
char *mix=(char *)malloc(strlen(oldn)+strlen(newn));
sprintf(mix,"rename %s %s",oldn,newn);
system(mix);
printf("\n");
free(mix);
}
void deletefile(char *del)
{
char *mix=(char *)malloc(strlen(del));
sprintf(mix,"rmdir %s",del);
system(mix);
printf("\n");
free(mix);
}
void createfile(char *mk)
{
char *mix=(char *)malloc(strlen(mk));
sprintf(mix,"mkdir %s",mk);
system(mix);
printf("\n");
free(mix);
}
首先,在主函数main前声明外部函数体分别为:
其次,和以前一样,我讲一下代码运行的原理:
在主函数中我利用了while循环保持程序永久运行下去,并且在while循环中使用了switch...case语句块来判断操作选项的序号op并用scanf接收用户输入,每个序号对应不同的操作选项。比如:
1表示显示当前目录。此时主函数会调用外部函数listfiles。listfiles中包含了批处理命令dir。dir表示显示当前所在路径下的所有文件及文件夹,并且调用了system函数体来执行dir这条指令。
2表示更改目录的名称。在case语句块中定义char类型的变量 *o,*n,old1[20],new1[20] 。其中o指针指向old1数组的首地址,n指针指向new1数组的首地址。用scanf接受用户输入的旧目录名old1和新目录名new1并利用指针o和n传递参数至changefile中。在changefile中定义数组指针mix并为其分配适当大小的内存空间。利用sprintf处理传递过来的参数的值来形成完整的批处理指令。最后调用system函数来执行指令并释放指针mix所占内存的空间。
3表示删除指定的目录。在case语句块中定义char类型的变量 *d,del[20] 。其中d指针指向del数组的首地址。用scanf接受用户输入的目录名并利用指针d传递参数至deletefile中。在deletefile中定义数组指针mix并为其分配适当大小的内存空间。利用sprintf处理传递过来的参数的值来形成完整的批处理指令。最后调用system函数来执行指令并释放指针mix所占内存的空间。
4表示创建目录。在case语句块中定义char类型的变量 *m,mk[20]。其中m指针指向mk数组的首地址。用scanf接受用户输入的目录名并利用指针m传递参数至createfile中。在createfile中定义数组指针mix并为其分配适当大小的内存空间。利用sprintf处理传递过来的参数的值来形成完整的批处理指令。最后调用system函数来执行指令并释放指针mix所占内存的空间。
5表示退出该程序。此时主函数会调用外部函数system并执行实参里的taskkill指令。其中taskkill指令的用法如下:
TASKKILL [/S system [/U username [/P [password]]]]
{ [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]
描述:
使用该工具按照进程 ID (PID) 或映像名称终止任务。
参数列表:
/S system 指定要连接的远程系统。
/U [domain\]user 指定应该在哪个用户上下文执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果忽略,提示
输入。
/FI filter 应用筛选器以选择一组任务。
允许使用 "*"。例如,映像名称 eq acme*
/PID processid 指定要终止的进程的 PID。
使用 TaskList 取得 PID。
/IM imagename 指定要终止的进程的映像名称。通配符 '*'可用来
指定所有任务或映像名称。
/T 终止指定的进程和由它启用的子进程。
/F 指定强制终止进程。
/? 显示帮助消息。
筛选器:
筛选器名 有效运算符 有效值
----------- --------------- -------------------------
STATUS eq, ne RUNNING |
NOT RESPONDING | UNKNOWN
IMAGENAME eq, ne 映像名称
PID eq, ne, gt, lt, ge, le PID 值
SESSION eq, ne, gt, lt, ge, le 会话编号。
CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
hh:mm:ss。
hh - 时,
mm - 分,ss - 秒
MEMUSAGE eq, ne, gt, lt, ge, le 内存使用量,单位为 KB
USERNAME eq, ne 用户名,格式为 [domain\]user
MODULES eq, ne DLL 名称
SERVICES eq, ne 服务名称
WINDOWTITLE eq, ne 窗口标题
说明
----
1) 只有在应用筛选器的情况下,/IM 切换才能使用通配符 '*'。
2) 远程进程总是要强行 (/F) 终止。
3) 当指定远程机器时,不支持 "WINDOWTITLE" 和 "STATUS" 筛选器。
例如:
TASKKILL /IM notepad.exe
TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
TASKKILL /F /IM cmd.exe /T
TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
TASKKILL /S system /U 域\用户名 /FI "用户名 ne NT*" /IM *
TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"
使用taskkill消杀掉应用程序为operate_files.exe(这是我定义的程序名称)的进程并返回进程的标识符pid。
至此,本篇文章的讲解结束了。感谢大家的耐心观看。最后提一句:可能我在这个寒假更新有关数据结构的不同语言实现。敬请期待后续的文章更新吧。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧