嵌入式实验第一次课后作业-2

题目如下

      设计一个程序,  以列表形式列出当前目录下的所有. c文件和子目录。文件信息包括文件名、文件大小、文件修改时间。
      接收用户输入的每一-行命令:当输入列出的文件名时,显示该文件内容,然后等待用户回车返回文件目录列表;
      当输入子目录名称时,进入该目录并列出该目录下的所有. c文件和子目录;
      当输入..时返回上层目录,当输入exit时,退出程序
嵌入式实验课后作业2:.c文件终端浏览小程序

附加要求1:同时支持.h和.c文件查看显示
附加要求2:添加功能,支持剪切、复制、粘贴、删除等文件操作

首先,我们要知道怎么找到用户想要的那级路径,格式大概是:系统路径=当前路径+/+用户输入的路径。然后,要非常小心这个/,我用了大量的混乱操作,才实现了每次填改删除之后路径都是系统可识别的,不会多出/也不会少出/

然后,我们要知道文件类型,而linux下文件类型和windows下不一样,只有七大文件类型,用库函数并不能判断后缀名,代码中用到了两种类型的判断,库文件为<sys/types.h>

  • S_ISDIR(s_buf.st_mode)
  • 判断是否为文件夹
  • S_ISREG(s_buf.st_mode)
  • 判断是否为普通文件

当然,还需要先引用库<sys/stat.h>中的stat(path,&s_buf) 函数来获取文件信息

获取到信息为普通文件后,再通过对文件名中最后一个字符的判别来确定是不是.c或者.h文件,若是,则进入下一步:打印文件大小与最后修改日期,这些信息可以从dirent结构体中读取。不过时间是自从1970年1月1日0时之后经过的秒数,需要通过<time.h>中的ctime()转换为字符串格式的年月日时分秒

接下来,需要实现打开浏览.c、.h文件内容的功能,只需用fopen()打开文件,用fgetc()从第一个字符读取到最后一个字符结束,将所有读取内容直接打印即可完成。最后回车返回上级目录这点,需要使用一个标志位来跳过下次开始循环时需要输入内容

exit退出和..返回上级目录没啥好说的,多多注意'/'即可

最后,还需实现附加的文件操作,我用了一个':'来检测是否是文件操作符,进入之后,识别到相应的文件操作符,做出对应动作。

  • :rm 为删除文件,调用一个remove()函数即可轻松删除对应位置文件
  • :cp 为复制粘贴文件,用fopen()开出两个文件,分别是r+和w+格式打开,然后把所有字符用fread()全部读出来再用fwrite()写进去即可,注意这里用循环,防止文件太大导致栈溢出
  • :mv 为剪切文件,只需先cp再rm源文件就ok啦

源代码下载链接

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注