C语言与批处理命令实现简单的文件目录管理

        好久没写文章了。突然怀念以前写文章的时候。碰巧我刚刚放假回家。于是乎我又开始了新一轮的在家研究。这一次的研究主题是:利用C语言与batch实现简单的文件目录管理。具体代码如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void 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前声明外部函数体分别为:

  • void listfiles(); //查看目录的文件。
  • void changefile(char *oldn,char *newn);//更改目录的名称。
  • void deletefile(char *del);//删除指定目录。
  • void createfile(char *mk);//创建指定名称的目录。

其次,和以前一样,我讲一下代码运行的原理:

        在主函数中我利用了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。

        至此,本篇文章的讲解结束了。感谢大家的耐心观看。最后提一句:可能我在这个寒假更新有关数据结构的不同语言实现。敬请期待后续的文章更新吧。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荧光百叶草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值