myFile.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #include "myFile.h"
  2. /*
  3. *********************************************************************************************************
  4. * 函 数 名: int write_file(const char* filename, const char* data, uint32_t length)
  5. * 形 参:*fileName所创建的文件系统名称*data要写入字符串的首地址,总共要写入的数据长度。
  6. * 返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void write_file(const char* filename, const char* data, uint32_t length)
  10. {
  11. /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
  12. FRESULT result;
  13. FATFS fs;
  14. FIL file;
  15. DIR DirInf;
  16. uint32_t bw;
  17. /* 挂载文件系统 */
  18. result = f_mount(&fs, FS_VOLUME_NAND, 0); /* Mount a logical drive */
  19. if (result != FR_OK)
  20. {
  21. // LOG_PRINT(LOG_ERROR,"(%d)\r\n", result);
  22. printf("挂载文件系统失败 (%d)\r\n", result);
  23. }
  24. /* 打开根文件夹 */
  25. result = f_opendir(&DirInf, "0:/"); /* 0: 表示盘符 */
  26. if(result==FR_NO_FILESYSTEM) //如果返回值为无filesystem则创建文件系统
  27. {
  28. result=f_mkfs("0:",0,0);
  29. }
  30. if (result != FR_OK)
  31. {
  32. // LOG_PRINT(LOG_ERROR,"打开根目录失败 (%d)\r\n", result);
  33. printf("打开根目录失败 (%d)\r\n", result);
  34. return ;
  35. }
  36. char filepath[30];
  37. sprintf(filepath, "0:/%s", filename);//为filename加入filepath前缀
  38. /* 打开文件 */
  39. result = f_open(&file, filepath, FA_CREATE_ALWAYS | FA_WRITE);
  40. /* 写一串数据 */
  41. result = f_write(&file,data, length, &bw);
  42. if (result == FR_OK)
  43. {
  44. // LOG_PRINT(LOG_INFO,"文件写入成功\r\n");
  45. printf("文件写入成功\r\n");
  46. }
  47. else
  48. {
  49. // LOG_PRINT(LOG_ERROR,"文件写入失败\r\n");
  50. printf("文件写入失败\r\n");
  51. }
  52. /* 关闭文件*/
  53. f_close(&file);
  54. /* 卸载文件系统 */
  55. f_mount(NULL, FS_VOLUME_NAND, 0);
  56. }
  57. /*
  58. *********************************************************************************************************
  59. * 函 数 名: ReadFileData
  60. * 功能说明:
  61. * 形 参:无
  62. * 返 回 值: 无
  63. *********************************************************************************************************
  64. */
  65. void read_file(const char* filename, char* data)
  66. {
  67. /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
  68. FRESULT result;
  69. FATFS fs;
  70. FIL file;
  71. DIR DirInf;
  72. uint32_t bw;
  73. /* 挂载文件系统 */
  74. result = f_mount(&fs, FS_VOLUME_NAND, 0); /* Mount a logical drive */
  75. if (result != FR_OK)
  76. {
  77. // LOG_PRINT(LOG_ERROR,"挂载文件系统失败(%d)\r\n", result);
  78. printf("挂载文件系统失败(%d)\r\n", result);
  79. }
  80. /* 打开根文件夹 */
  81. result = f_opendir(&DirInf, "0:/");
  82. if(result==FR_NO_FILESYSTEM) //如果返回值为无filesystem则创建文件系统
  83. {
  84. f_mkfs("0:",0,0);
  85. }
  86. if (result != FR_OK)
  87. {
  88. // LOG_PRINT(LOG_ERROR,"打开根目录失败(%d)\r\n", result);
  89. printf("打开根目录失败(%d)\r\n", result);
  90. goto _exit_file;
  91. }
  92. char filepath[30];
  93. sprintf(filepath, "0:/%s", filename);//为filename加入filepath前缀
  94. /* 打开文件 */
  95. result = f_open(&file, filepath, FA_OPEN_EXISTING | FA_READ);
  96. if (result != FR_OK)
  97. {
  98. // LOG_PRINT(LOG_ERROR,"Don't Find File \r\n");
  99. printf("Don't Find File \r\n");
  100. goto _exit_file;
  101. }
  102. /* 读取文件 */
  103. result= f_read(&file, data, f_size(&file), &bw);
  104. if (bw > 0)
  105. {
  106. //LOG_PRINT(LOG_INFO,"\r\%s 文件内容 : \r\n%s\r\n", filename,data);
  107. printf("\r\%s 文件内容 : \r\n%s\r\n", filename,data);
  108. }
  109. else
  110. {
  111. //LOG_PRINT(LOG_INFO,"\r\%s 文件内容 : \r\n%s\r\n", filename);
  112. printf("\r\%s 文件内容 : \r\n",filename);
  113. }
  114. _exit_file:
  115. /* 关闭文件*/
  116. f_close(&file);
  117. /* 卸载文件系统 */
  118. f_mount(NULL, FS_VOLUME_NAND, 0);
  119. }
  120. /*
  121. *********************************************************************************************************
  122. * 函 数 名: ViewRootDir
  123. * 功能说明: 显示SD卡根目录下的文件名
  124. * 形 参:无
  125. * 返 回 值: 无
  126. *********************************************************************************************************
  127. */
  128. void ViewRootDir(void)
  129. {
  130. /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
  131. FRESULT result;
  132. FATFS fs;
  133. DIR DirInf;
  134. FILINFO FileInf;
  135. uint32_t cnt = 0;
  136. char lfname[256];
  137. /* 挂载文件系统 */
  138. result = f_mount(&fs, FS_VOLUME_NAND, 0); /* Mount a logical drive */
  139. if (result != FR_OK)
  140. {
  141. // LOG_PRINT(LOG_ERROR,"挂载文件系统失败(%d)\r\n", result);
  142. printf("挂载文件系统失败 (%d)\r\n", result);
  143. }
  144. /* 打开根文件夹 */
  145. result = f_opendir(&DirInf, "0:/"); /* 0: 表示盘符 */
  146. if (result != FR_OK)
  147. {
  148. // LOG_PRINT(LOG_ERROR,"打开根目录失败(%d)\r\n", result);
  149. printf("打开根目录失败 (%d)\r\n", result);
  150. return;
  151. }
  152. /* 读取当前文件夹下的文件和目录 */
  153. FileInf.lfname = lfname;
  154. FileInf.lfsize = 256;
  155. // LOG_PRINT(LOG_INFO,"属性 | 文件大小 | 短文件名 | 长文件名\r\n");
  156. printf("属性 | 文件大小 | 短文件名 | 长文件名\r\n");
  157. for (cnt = 0; ;cnt++)
  158. {
  159. result = f_readdir(&DirInf,&FileInf); /* 读取目录项,索引会自动下移 */
  160. if (result != FR_OK || FileInf.fname[0] == 0)
  161. {
  162. break;
  163. }
  164. if (FileInf.fname[0] == '.')
  165. {
  166. continue;
  167. }
  168. /* 判断是文件还是子目录 */
  169. if (FileInf.fattrib & AM_DIR)
  170. {
  171. // LOG_PRINT(LOG_INFO,"(0x%02d)目录 ", FileInf.fattrib);
  172. printf("(0x%02d)目录 ", FileInf.fattrib);
  173. }
  174. else
  175. {
  176. // LOG_PRINT(LOG_INFO,"(0x%02d)文件 ", FileInf.fattrib);
  177. printf("(0x%02d)文件 ", FileInf.fattrib);
  178. }
  179. // /* 打印文件大小, 最大4G */
  180. // LOG_PRINT(LOG_INFO," %10d", FileInf.fsize);
  181. // LOG_PRINT(LOG_INFO," %s |", FileInf.fname);
  182. // LOG_PRINT(LOG_INFO," %s\r\n", (char *)FileInf.lfname);
  183. /* 打印文件大小, 最大4G */
  184. printf(" %10d", FileInf.fsize);
  185. printf(" %s |", FileInf.fname); /* 短文件名 */
  186. printf(" %s\r\n", (char *)FileInf.lfname); /* 长文件名 */
  187. }
  188. /* 卸载文件系统 */
  189. f_mount(NULL, FS_VOLUME_NAND, 0);
  190. }
  191. /*
  192. *********************************************************************************************************
  193. * 函 数 名: DeleteDirFile
  194. * 功能说明: 删除SD卡根目录下的 armfly.txt 文件和 Dir1,Dir2 目录
  195. * 形 参:无
  196. * 返 回 值: 无
  197. *********************************************************************************************************
  198. */
  199. void DeleteDirFile(const char* filename)
  200. {
  201. /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
  202. FRESULT result;
  203. FATFS fs;
  204. char FileName[50];
  205. sprintf(FileName,"0:/%s",filename);
  206. uint8_t i;
  207. /* 挂载文件系统 */
  208. result = f_mount(&fs, FS_VOLUME_NAND, 0); /* Mount a logical drive */
  209. if (result != FR_OK)
  210. {
  211. // LOG_PRINT(LOG_ERROR,"挂载文件系统失败(%d)\r\n", result);
  212. printf("挂载文件系统失败 (%d)\r\n", result);
  213. }
  214. #if 0
  215. /* 打开根文件夹 */
  216. result = f_opendir(&DirInf, "0:/"); /* 如果不带参数,则从当前目录开始 */
  217. if (result != FR_OK)
  218. {
  219. // LOG_PRINT(LOG_ERROR,"挂载文件系统失败(%d)\r\n", result);
  220. printf("打开根目录失败(%d)\r\n", result);
  221. return;
  222. }
  223. #endif
  224. /* 删除文件 */
  225. result = f_unlink(FileName);
  226. if (result == FR_OK)
  227. {
  228. // LOG_PRINT(LOG_ERROR,"删除文件 %s 成功\r\n",filename);
  229. printf("删除文件 %s 成功\r\n",filename);
  230. }
  231. else if (result == FR_NO_FILE)
  232. {
  233. // LOG_PRINT(LOG_ERROR,"没有发现文件或目录 :%s\r\n", filename);
  234. printf("没有发现文件或目录 :%s\r\n", filename);
  235. }
  236. else
  237. {
  238. // LOG_PRINT(LOG_ERROR,"删除%s失败(错误代码 = %d) 文件只读或目录非空\r\n",filename,result);
  239. printf("删除%s失败(错误代码 = %d) 文件只读或目录非空\r\n",filename,result);
  240. }
  241. /* 卸载文件系统 */
  242. f_mount(NULL, FS_VOLUME_NAND, 0);
  243. }