XCOSnTh-fatfsShell

?

#include "XCOSnTh.h"
#include "ff.h"
#include "stdio.h"
static char pwd[1024]="1:";
static char pwdCount=2;
FRESULT lsExe(char *path,int(*printf)(const char* format, ...))
{FRESULT res;DIR dir;FILINFO fno;// 打開根目錄res = f_opendir(&dir, path);if (res != FR_OK) {// 處理錯誤,比如未找到目錄printf("\r\nerror %d",res);return res;}// 循環讀取目錄條目for (;;) {res = f_readdir(&dir, &fno);if (res != FR_OK || fno.fname[0] == 0) {break; // 錯誤或遍歷完成}// 忽略 "." 和 ".." 條目(根據系統配置可能存在)if (fno.fname[0] == '.') continue;// 判斷是文件還是目錄if (fno.fattrib & AM_DIR) {// 目錄:顯示時加標記,比如 [D] 文件夾名printf("[D] %s\r\n", fno.fname);} else {// 文件:直接顯示文件名printf("[F] %s\r\n", fno.fname);}}// 關閉目錄(某些版本 FatFs 可省略)f_closedir(&dir);return FR_OK;
}
static int lsCMD(CmdObj obj,char *str,int len)
{lsExe(pwd,obj->printf);return 1;
}
CmdDef(ls,0,lsCMD,"");
static int pwdCMD(CmdObj obj,char *str,int len)
{obj->printf("\r\n%s",pwd);return 1;
}
CmdDef(pwd,0,pwdCMD,"");
static int cdCMD(CmdObj obj,char *str,int len)
{str[len]=0;if(str[0]=='.'){if(str[1]=='.'){int i;for(i=pwdCount;i>0;i--){if(pwd[i]=='/'){pwd[i]=0;pwdCount=i;break;}}}}else{pwdCount+=sprintf(&pwd[pwdCount],"/%s",str);}obj->printf("%s\r\n",pwd);if(lsExe(pwd,obj->printf)!=FR_OK){int i;for(i=pwdCount;i>0;i--){if(pwd[i]=='/'){pwd[i]=0;pwdCount=i;break;}}obj->printf("\r\n%s",pwd);}return 1;
}
CmdDef(cd,0,cdCMD,"");static int mkdirCMD(CmdObj obj,char *str,int len)
{pwdCount+=sprintf(&pwd[pwdCount],"/%s",str);f_mkdir(pwd);{int i;for(i=pwdCount;i>0;i--){if(pwd[i]=='/'){pwd[i]=0;pwdCount=i;break;}}}lsExe(pwd,obj->printf);return 1;
}
CmdDef(mkdir,0,mkdirCMD,"");void delete_directory(char *path) {FRESULT res;// 確保文件系統已掛載(如 f_mount(&fs, "", 1))// 刪除空目錄res = f_unlink(path);// 錯誤處理switch (res) {case FR_OK:printf("目錄刪除成功!\r\n");break;case FR_NO_FILE:case FR_NO_PATH:printf("目錄不存在!\r\n");break;case FR_DENIED:printf("目錄非空或權限不足!\r\n");break;case FR_INVALID_NAME:printf("路徑格式錯誤!\r\n");break;default:printf("錯誤代碼:%d\r\n", res);}
}
void delete_directory_recursive(const TCHAR* path) {//遞歸刪除DIR dir;FILINFO fno;FRESULT res;res = f_opendir(&dir, path);if (res != FR_OK) return;while (1) {res = f_readdir(&dir, &fno);if (res != FR_OK || fno.fname[0] == 0) break;if (fno.fname[0] == '.') continue; // 忽略 "." 和 ".."TCHAR sub_path[256];sprintf(sub_path, "%s/%s", path, fno.fname);if (fno.fattrib & AM_DIR) {delete_directory_recursive(sub_path); // 遞歸刪除子目錄} else {f_unlink(sub_path); // 刪除文件}}f_closedir(&dir);f_unlink(path); // 刪除空目錄
}
static int rmCMD(CmdObj obj,char *str,int len)
{str[len]=0;if((str[0]=='-')&&(str[1]=='r')){pwdCount+=sprintf(&pwd[pwdCount],"/%s",&str[3]);delete_directory_recursive(pwd);}else{pwdCount+=sprintf(&pwd[pwdCount],"/%s",str);delete_directory(pwd);}{int i;for(i=pwdCount;i>0;i--){if(pwd[i]=='/'){pwd[i]=0;pwdCount=i;break;}}}lsExe(pwd,obj->printf);return 1;
}
CmdDef(rm,0,rmCMD,"");void create_file(char *path,int(*printf)(const char* format, ...)) {FRESULT res;FIL fil; // 文件對象// 確保文件系統已掛載(如 f_mount(&fs, "", 1))// 創建文件(若存在則覆蓋)res = f_open(&fil, path, FA_CREATE_ALWAYS | FA_WRITE);// 錯誤處理if (res == FR_OK) {printf("文件創建成功!\r\n");// 可選:寫入初始內容(例如空文件則無需寫入)// UINT bytes_written;// f_write(&fil, "Hello", 5, &bytes_written);f_close(&fil); // 必須關閉文件!} else {switch (res) {case FR_EXIST:printf("文件已存在(若使用 FA_CREATE_NEW)!\r\n");break;case FR_INVALID_NAME:printf("路徑格式錯誤!\r\n");break;case FR_DENIED:printf("磁盤已滿或寫保護!\r\n");break;default:printf("錯誤代碼:%d\r\n", res);}}
}
static int touchCMD(CmdObj obj,char *str,int len)
{pwdCount+=sprintf(&pwd[pwdCount],"/%s",str);create_file(pwd,obj->printf);{int i;for(i=pwdCount;i>0;i--){if(pwd[i]=='/'){pwd[i]=0;pwdCount=i;break;}}}lsExe(pwd,obj->printf);return 1;
}
CmdDef(touch,0,touchCMD,"");void check_file_status(char *path,int(*printf)(const char* format, ...)) {FRESULT res;FILINFO fno;// 確保文件系統已掛載(如 f_mount(&fs, "", 1))// 獲取文件狀態res = f_stat(path, &fno);// 處理結果if (res == FR_OK) {printf("文件狀態信息:\r\n");printf("- 文件名: %s\r\n", fno.fname);printf("- 大小: %ld 字節\r\n", fno.fsize);printf("- 屬性: %s%s\r\n",(fno.fattrib & AM_DIR) ? "[目錄]" : "[文件]",(fno.fattrib & AM_RDO) ? " (只讀)" : "");// 解析日期和時間(FAT 格式)uint16_t fdate = fno.fdate;uint16_t ftime = fno.ftime;printf("- 修改日期: %04d-%02d-%02d\r\n",(1980 + (fdate >> 9)),         // 年(fdate >> 5) & 0x0F,           // 月fdate & 0x1F);                 // 日printf("- 修改時間: %02d:%02d:%02d\r\n",(ftime >> 11),                 // 小時(ftime >> 5) & 0x3F,           // 分鐘(ftime & 0x1F) * 2);           // 秒(精度為2秒)} else {switch (res) {case FR_NO_FILE:printf("文件不存在!\r\n");break;case FR_INVALID_NAME:printf("路徑格式錯誤!\r\n");break;default:printf("錯誤代碼:%d\r\n", res);}}
}static int statCMD(CmdObj obj,char *str,int len)
{pwdCount+=sprintf(&pwd[pwdCount],"/%s",str);check_file_status(pwd,obj->printf);{int i;for(i=pwdCount;i>0;i--){if(pwd[i]=='/'){pwd[i]=0;pwdCount=i;break;}}}return 1;
}
CmdDef(stat,0,statCMD,"");

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906483.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

篇章十 消息持久化(二)

目錄 1.消息持久化-創建MessageFileManger類 1.1 創建一個類 1.2 創建關于路徑的方法 1.3 定義內部類 1.4 實現消息統計文件讀寫 1.5 實現創建消息目錄和文件 1.6 實現刪除消息目錄和文件 1.7 實現消息序列化 1. 消息序列化的一些概念: 2. 方案選擇&#xf…

中間件-seata

分布式事務seata 角色組成角色指責AT模式TCC模式 角色組成 TC:事務協調者,維護全局和分支事務的狀態,驅動全局事務提交或回滾。TM:事務管理者,定義全局事務的范圍:開始全局事務、提交或回滾全局事務。RM&am…

python代碼繪制某只股票最近90天的K線圖、均線、量能圖

運行代碼,要求輸入股票代碼和名稱,其他參數可省略 import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import date…

Xilinx 7Series\UltraScale 在線升級FLASH STARTUPE2和STARTUPE3使用

一、FPGA 在線升級 FPGA 在線升級FLASH時,一般是通過邏輯生成SPI接口操作FLASH,當然也可以通過其他SOC經FPGA操作FLASH,那么FPGA就要實現在啟動后對FLASH的控制。 對于7Series FPGA,只有CCLK是專用引腳,SPI接口均為普…

Azure 應用服務中的異常處理、日志記錄和通知:綜合指南

簡介 Azure 應用服務是基于云的應用程序,使開發人員能夠在云上構建、部署和管理應用程序。與任何應用程序一樣,制定適當的異常處理、日志記錄和通知實踐至關重要,以確保應用程序平穩運行,并快速識別和解決任何問題。在本篇博文中&…

Java 應用如何實現 HTTPS:加密數據傳輸的實用指南

Java 應用如何實現 HTTPS:加密數據傳輸的實用指南 在當今的互聯網環境中,數據安全至關重要,HTTPS 作為加密的數據傳輸協議,為 Java 應用提供了安全通信的保障。本文將深入探討 Java 應用如何實現 HTTPS,通過詳細代碼實…

域名與DNS詳解

域名與DNS詳解 一、核心概念 域名(Domain Name) 定義:人類可讀的網絡地址標識(如 www.google.com)作用:替代復雜IP地址(類似"手機通訊錄"功能) DNS(Domain …

c++20引入的三路比較操作符<=>

目錄 一、簡介 二、三向比較的返回類型 2.1 std::strong_ordering 2.2 std::weak_ordering 2.3 std::partial_ordering 三、對基礎類型的支持 四、自動生成的比較運算符函數 4.1 std::rel_ops的作用 4.2 使用<> 五、兼容他舊代碼 一、簡介 c20引入了三路比較操…

計算機網絡相關面試題

一、HTTP1.1和HTTP2的區別 HTTP/1&#xff08;主要指 HTTP/1.1&#xff09;和 HTTP/2 是 Web 協議發展中的兩個重要版本&#xff0c;二者在性能、協議機制和功能特性上有顯著差異。以下從多個維度對比分析&#xff0c;并結合具體案例說明&#xff1a; 一、連接與請求處理方式 1…

圖論算法精解(Java 實現):從基礎到高頻面試題

一、圖的基礎表示方法 1.1 鄰接矩陣&#xff08;Adjacency Matrix&#xff09; 鄰接矩陣是表示圖的一種直觀方式&#xff0c;它使用一個二維數組來存儲節點之間的連接關系。對于一個有 n 個節點的圖&#xff0c;鄰接矩陣是一個 nn 的矩陣&#xff0c;其中 matrix [i][j] 表示…

江科大TIM定時器hal庫實現

定時器相關hal庫函數 hal庫的定時器函數相比于標準庫&#xff0c;多了很多的中斷回調函數&#xff0c;同時對于定時器的初始化也改成使用句柄一次性順帶連帶DMA等功能一起初始化了 typedef struct {uint32_t Prescaler; /*定時器的預分頻值*/uint32_t CounterMode; …

CentOS 10:啟動telnet服務

參考&#xff0c; 鳥哥私房菜 - 第七章、網路安全與主機基本防護&#xff1a;限制埠口, 網路升級與 SELinux 7.3.3 埠口與服務的啟動/關閉及開機時狀態設定 我們知道系統的 Telnet 服務通常是以 super daemon 來控管的&#xff0c;請您啟動您系統的 telnet 試看看。 1 要啟動 …

Taro 安全區域

目錄 一、問題描述 二、問題解決 1、頂部劉海區 2、底部小黑條 一、問題描述 安全區域主要是為了避免劉海屏或底部欄遮擋&#xff0c;而造成的不良顯示效果。 本次將針對以下兩點進行考量&#xff1a; 1、頂部劉海屏區 2、蘋果X底部小黑條 二、問題解決 通過Taro.getS…

【Java微服務組件】分布式協調P1-數據共享中心簡單設計與實現

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 歡迎評論交流&#xff0c;感謝您的閱讀&#x1f604;。 目錄 引言設計一個共享數據中心選擇數據模型鍵值對設計 數據可靠性設計持久化快照 &#xff08…

在SpringBoot項目中,使用單元測試@Test

1.引入依賴 <!--單元測試Test的依賴--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>3.2.1</version> </dependency> 2.在src/test/java目錄…

在Java中,將Object對象轉換為具體實體類對象

在Java中&#xff0c;將Object對象轉換為具體實體類對象可以通過以下幾種方法實現&#xff1a; 1?.使用instanceof關鍵字進行類型檢查和轉換?&#xff1a; 首先&#xff0c;使用instanceof關鍵字檢查Object對象是否為目標實體類的類型。 如果是&#xff0c;則進行強制類型…

JAVA學習-練習試用Java實現“音頻文件的讀取與寫入 :使用Java音頻庫處理音頻數據”

問題&#xff1a; java語言編輯&#xff0c;實現音頻文件的讀取與寫入 &#xff1a;使用Java音頻庫處理音頻數據。 解答思路&#xff1a; 在Java中處理音頻文件通常需要使用第三方庫&#xff0c;例如javax.sound.sampled包&#xff0c;它提供了處理音頻文件的基本功能。以下是一…

Flink架構概覽,Flink DataStream API 的使用,FlinkCDC的使用

一、Flink與其他組件的協同 Flink 是一個分布式、高性能、始終可用、準確一次&#xff08;Exactly-Once&#xff09;語義的流處理引擎&#xff0c;廣泛應用于大數據實時處理場景中。它與 Hadoop 生態系統中的組件可以深度集成&#xff0c;形成完整的大數據處理鏈路。下面我們從…

linux 查看java的安裝路徑

一、驗證Java安裝狀態 java -version正常安裝會顯示版本信息&#xff1a; openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)二、檢查環境變量配置 若已配置JAVA_HOME&#…

2025-5-21 個人筆記篇matlab小筆記和clang基礎使用(簡單記錄)

個人筆記篇 再不記錄就找不到了&#xff0c;之前學的一點基礎&#xff0c;看看就行,請不要提問,因為很久了>_<(至少我看來是這樣的) matlab小筆記 % 開繪制(新建) figure % 設置繪制標題 title(標題); % 設置繪制的X軸Lable xlabel(x); % 設置繪制的y軸Lable ylabel(cos…