转自公众号,欢迎关注
工程源码参加附件
前言 前面我们移植了文件系统,实现了文件的导入导出,为了方便使用还需要实现文件的一般操作,比如文件删除,拷贝,移动等,这一篇就实现这些操作的shell命令。 过程 创建目录实现代码
- void MkdirFun(void * cmdbuf)
- {
- uint8_t path[64];
- unsigned int len = sscanf((char const *)cmdbuf, "%*s %s", path);
- if (len == 1)
- {
- lfs_mkdir(&lfs, (const char*)path);
- }
- else
- {
- printf("usage:rm path\r\n");
- }
- }
复制代码
测试 命令行输入 mkdir dir1创建目录1 ls /查看 看到创建了目录dir1
删除空目录或者文件实现代码
- void RmFun(void * cmdbuf)
- {
- uint8_t path[64];
- unsigned int len = sscanf((char const *)cmdbuf, "%*s %s", path);
- if (len == 1)
- {
- lfs_remove(&lfs, (const char *)path);
- }
- else
- {
- printf("usage:rm path\r\n");
- }
- }
复制代码
测试 输入rm dir1 再ls /查看 看到dir目录删除了
rm rx.txt删除文件 再ls /查看删除了
ls文件实现
- int ls_file(const char* path)
- {
- lfs_dir_t dir;
- struct lfs_info info;
- if(lfs_dir_open(&lfs, &dir, "/") < 0)
- {
- return -1;
- }
- while(1)
- {
- int res = lfs_dir_read(&lfs, &dir, &info);
- if(res == 1)
- {
- if(info.type == LFS_TYPE_DIR)
- {
- //if((memcmp(info.name,".",2)!=0) && (memcmp(info.name,"..",3)!=0))
- //{
- /// ls_file(info.name);
- //}
- printf("D:%s %d\r\n",info.name,info.size);
- }
- else if(info.type == LFS_TYPE_REG)
- {
- printf("F:%s %d\r\n",info.name,info.size);
- }
- }
- else
- {
- break;
- }
- }
- lfs_dir_close(&lfs, &dir);
- return 0;
- }
-
-
- void LsFun(void * cmdbuf)
- {
- uint8_t dir[64];
- unsigned int len = sscanf((char const *)cmdbuf, "%*s %s", dir);
- if (len == 1)
- {
- ls_file((const char*)dir);
- }
- else
- {
- printf("usage:ls dir\r\n");
- }
- }
-
复制代码
测试 ls /查看根目录下文件
格式化实现
- void MkfsFun(void * cmdbuf)
- {
- lfs_unmount(&lfs);
- lfs_format(&lfs, &lfs_cfg);
- lfs_mount(&lfs, &lfs_cfg);
- }
-
复制代码
测试 先ls /查看当前有文件 然后mkfs之后 ls /查看文件都没有了 然后mkdir dir1创建文件,ls /查看创建成功 说明格式化后文件系统正常。
重命名空目录或者文件实现
- void RenameFun(void * cmdbuf)
- {
- uint8_t oldpath[64];
- uint8_t newpath[64];
- unsigned int len = sscanf((char const *)cmdbuf, "%*s %s %s", oldpath, newpath);
- if (len == 2)
- {
- lfs_rename(&lfs, (const char *)oldpath, (const char *)newpath);
- }
- else
- {
- printf("usage:rename old new\r\n");
- }
- }
-
复制代码
测试 测试重命名空文件 先ls /查看 然后rename dir1 dir2改名 然后ls /查看 dir1改为了dir2
测试重命名文件类似 如下将rx.txt改为sx.txt
复制文件实现
- void cpfile(char const * oldpath, char const * newpath)
- {
- uint8_t cpbuffer[64];
- lfs_file_t oldfile;
- lfs_file_t newfile;
- if(lfs_file_open(&lfs, &oldfile, (const char*)oldpath, LFS_O_RDWR | LFS_O_CREAT) < 0)
- {
- return;
- }
- if(lfs_file_open(&lfs, &newfile, (const char*)newpath, LFS_O_RDWR | LFS_O_CREAT) < 0)
- {
- lfs_file_close(&lfs,&oldfile);
- }
- while(1)
- {
- lfs_ssize_t len = lfs_file_read(&lfs, &oldfile, cpbuffer, sizeof(cpbuffer));
- if(len < sizeof(cpbuffer))
- {
- if(len <= 0)
- {
- lfs_file_close(&lfs,&oldfile);
- lfs_file_close(&lfs,&newfile);
- return;
- }
- else
- {
- lfs_file_write(&lfs, &newfile, cpbuffer, len);
- lfs_file_close(&lfs,&oldfile);
- lfs_file_close(&lfs,&newfile);
- return;
- }
- }
- else
- {
- lfs_file_write(&lfs, &newfile, cpbuffer, len);
- }
- }
- }
-
- void CpFun(void * cmdbuf)
- {
- uint8_t oldpath[64];
- uint8_t newpath[64];
-
- unsigned int len = sscanf((char const *)cmdbuf, "%*s %s %s", oldpath, newpath);
- if (len == 2)
- {
- cpfile((char const *)oldpath,(char const *)newpath);
- }
- else
- {
- printf("usage:rename old new\r\n");
- }
- }
复制代码
测试 ls /查看当前文件 cp sx.txt rx.txt复制文件 再ls /查看复制成功
移动文件实现,可以在复制的基础上删除源文件
- void MvFun(void * cmdbuf)
- {
- uint8_t oldpath[64];
- uint8_t newpath[64];
-
- unsigned int len = sscanf((char const *)cmdbuf, "%*s %s %s", oldpath, newpath);
- if (len == 2)
- {
- cpfile((char const *)oldpath,(char const *)newpath);
- lfs_remove(&lfs, (const char *)oldpath);
- }
- else
- {
- printf("usage:mv old new\r\n");
- }
- }
复制代码
测试 ls /查看当前文件 mv rx.txt sx.txt移动文件 再ls /查看移动成功
总结以上实现了基本的文件操作shell命令,基于此后面就可以方便的进行文件操作了。
|