#include "myFile.h"
/*
*********************************************************************************************************
*	函 数 名: int write_file(const char* filename, const char* data, uint32_t length)
*	形    参：*fileName所创建的文件系统名称*data要写入字符串的首地址，总共要写入的数据长度。
*	返 回 值: 无
*********************************************************************************************************
*/
void write_file(const char* filename, const char* data, uint32_t length)
{
  /* 本函数使用的局部变量占用较多，请修改启动文件，保证堆栈空间够用 */
	FRESULT result;
	FATFS fs;
	FIL file;
	DIR DirInf;
	uint32_t bw;

 	/* 挂载文件系统 */
	result = f_mount(&fs, FS_VOLUME_NAND, 0);			/* Mount a logical drive */
	if (result != FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"(%d)\r\n", result);
	}

	/* 打开根文件夹 */
	result = f_opendir(&DirInf, "0:/"); /* 0: 表示盘符 */
	if(result==FR_NO_FILESYSTEM)  //如果返回值为无filesystem则创建文件系统
	{
		result=f_mkfs("0:",0,0);
	}
	if (result != FR_OK)
	{	
		LOG_PRINT(LOG_ERROR,"打开根目录失败 (%d)\r\n", result);
		return ;
	}
  char filepath[30];
  sprintf(filepath, "0:/%s", filename);//为filename加入filepath前缀

	/* 打开文件 */
	result = f_open(&file, filepath, FA_CREATE_ALWAYS | FA_WRITE);

	/* 写一串数据 */
	result = f_write(&file,data, length, &bw);
	if (result == FR_OK)
	{
		LOG_PRINT(LOG_INFO,"文件写入成功\r\n");
		
	}
	else
	{
		LOG_PRINT(LOG_ERROR,"文件写入失败\r\n");
	}
	/* 关闭文件*/
	f_close(&file);
	/* 卸载文件系统 */
	f_mount(NULL, FS_VOLUME_NAND, 0);
}

/*
*********************************************************************************************************
*	函 数 名: ReadFileData
*	功能说明: 
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void read_file(const char* filename, char* data)
{
	/* 本函数使用的局部变量占用较多，请修改启动文件，保证堆栈空间够用 */
	FRESULT result;
	FATFS fs;
	FIL file;
	DIR DirInf;
	uint32_t bw;

 	/* 挂载文件系统 */
	result = f_mount(&fs, FS_VOLUME_NAND, 0);			/* Mount a logical drive */
	
	if (result != FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"挂载文件系统失败(%d)\r\n", result);
	}

	/* 打开根文件夹 */
	result = f_opendir(&DirInf, "0:/"); 
	if(result==FR_NO_FILESYSTEM)  //如果返回值为无filesystem则创建文件系统
	{
		f_mkfs("0:",0,0);
	}
	if (result != FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"打开根目录失败(%d)\r\n", result);		
		goto _exit_file;
	}
	char filepath[30];
  sprintf(filepath, "0:/%s", filename);//为filename加入filepath前缀
	/* 打开文件 */
	result = f_open(&file, filepath, FA_OPEN_EXISTING | FA_READ);
	if (result !=  FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"Don't Find File \r\n");			
		goto _exit_file;
	}

	/* 读取文件 */

	result= f_read(&file, data, f_size(&file), &bw);
	if (bw > 0)
	{
		LOG_PRINT(LOG_INFO,"\r\%s 文件内容 : \r\n%s\r\n", filename,data);			
	}
	else
	{
		LOG_PRINT(LOG_INFO,"\r\%s 文件内容 : \r\n%s\r\n", filename);			
	}
	_exit_file:
	/* 关闭文件*/
	f_close(&file);

	/* 卸载文件系统 */
	f_mount(NULL, FS_VOLUME_NAND, 0);
}
/*
*********************************************************************************************************
*	函 数 名: ViewRootDir
*	功能说明: 显示SD卡根目录下的文件名
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void ViewRootDir(void)
{
	/* 本函数使用的局部变量占用较多，请修改启动文件，保证堆栈空间够用 */
	FRESULT result;
	FATFS fs;
	DIR DirInf;
	FILINFO FileInf;
	uint32_t cnt = 0;
	char lfname[256];

 	/* 挂载文件系统 */
	result = f_mount(&fs, FS_VOLUME_NAND, 0);	/* Mount a logical drive */	
	if (result != FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"挂载文件系统失败(%d)\r\n", result);
	}
	/* 打开根文件夹 */
	result = f_opendir(&DirInf, "0:/"); /* 0: 表示盘符 */
	if (result != FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"打开根目录失败(%d)\r\n", result);
		return;
	}

	/* 读取当前文件夹下的文件和目录 */
	FileInf.lfname = lfname;
	FileInf.lfsize = 256;
	LOG_PRINT(LOG_INFO,"属性 |  文件大小 | 短文件名 | 长文件名\r\n");
	for (cnt = 0; ;cnt++)
	{
		result = f_readdir(&DirInf,&FileInf); 		/* 读取目录项，索引会自动下移 */
		if (result != FR_OK || FileInf.fname[0] == 0)
		{
			break;
		}

		if (FileInf.fname[0] == '.')
		{
			continue;
		}

		/* 判断是文件还是子目录 */
		if (FileInf.fattrib & AM_DIR)
		{
			LOG_PRINT(LOG_INFO,"(0x%02d)目录  ", FileInf.fattrib);			
		}
		else
		{
			LOG_PRINT(LOG_INFO,"(0x%02d)文件  ", FileInf.fattrib);			
		}

		/* 打印文件大小, 最大4G */
		LOG_PRINT(LOG_INFO," %10d", FileInf.fsize);		
		LOG_PRINT(LOG_INFO,"  %s |", FileInf.fname);

		LOG_PRINT(LOG_INFO,"  %s\r\n", (char *)FileInf.lfname);
	}

	/* 卸载文件系统 */
	f_mount(NULL, FS_VOLUME_NAND, 0);
}
/*
*********************************************************************************************************
*	函 数 名: DeleteDirFile
*	功能说明: 删除SD卡根目录下的 armfly.txt 文件和 Dir1，Dir2 目录
*	形    参：无
*	返 回 值: 无
*********************************************************************************************************
*/
void DeleteDirFile(const char* filename)
{
	/* 本函数使用的局部变量占用较多，请修改启动文件，保证堆栈空间够用 */
	FRESULT result;
	FATFS fs;
	char FileName[50];
	sprintf(FileName,"0:/%s",filename);
	uint8_t i;

 	/* 挂载文件系统 */
	result = f_mount(&fs, FS_VOLUME_NAND, 0);			/* Mount a logical drive */
	if (result != FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"挂载文件系统失败(%d)\r\n", result);
	}

	#if 0
	/* 打开根文件夹 */
	result = f_opendir(&DirInf, "0:/"); /* 如果不带参数，则从当前目录开始 */
	if (result != FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"挂载文件系统失败(%d)\r\n", result);
		return;
	}
	#endif
	/* 删除文件 */
	result = f_unlink(FileName);
	if (result == FR_OK)
	{
		LOG_PRINT(LOG_ERROR,"删除文件 %s 成功\r\n",filename);		
	}
	else if (result == FR_NO_FILE)
	{
		LOG_PRINT(LOG_ERROR,"没有发现文件或目录 :%s\r\n", filename);			
	}
	else
	{
		LOG_PRINT(LOG_ERROR,"删除%s失败(错误代码 = %d) 文件只读或目录非空\r\n",filename,result);		
	}
	/* 卸载文件系统 */
	f_mount(NULL, FS_VOLUME_NAND, 0);
}



