MTK创建路径及文件读写测试例程
提供一个MTK在FAT中创建路径及文件读写测试例程。
#define FILE_LEN_MAX 1024
#define S8 signed char
#define U16 unsigned short
//路径中带L和不带L的区别
//个人认为带L的路径代表的编码方式为Unicode,否则为ascii编码,没有相关资料证明,但软件测试结果通过。
#define T_USER_DIR_CONFIG ("z:\\@dywz\\config\\")
#define T_USER_DIR_LOCATION (L"z:\\@dywz\\location\\")
extern int FS_Open(const WCHAR * FileName, kal_uint32 Flag);
static U16 AnsiiToUnicodeString(S8 *pOutBuffer, S8 *pInBuffer)
{
return mmi_asc_to_ucs2(pOutBuffer, pInBuffer);
}
//open file with file Read-Only mode.
#define MODE_READ 1
//open file with Read-Write mode.
#define MODE_WRITE 2
//open file with Read-Write mode, create if the file not exist.
#define MODE_CREATE_ALWAYS_WRITE 4
//open file with Append mode.
#define MODE_APPEND 8
//************************************************************************
// 函数
// vm_file_is_exist
// 功能
// 判断文件是否存在
// 输入
// app_path 文件路径
// 输出
// TRUE/FALSE
//************************************************************************/
// 可以用来判断配置文件是否存在。
static int vm_file_is_exist(short * app_path)
{
int fd = -1;
fd = vm_file_open(app_path,MODE_READ,TRUE);
if(fd<0)
{
dbg_print("vm_file_is_exist: FALSE\r\n");
return FALSE;
}
vm_file_close(fd);
dbg_print("vm_file_is_exist: TRUE\r\n");
return TRUE;
}
void FS_test()
{
//文件句柄
FS_HANDLE h;
char filepath[128] = {0};
char filepath_unicode[128] = {0};
char filename[128] = {0};
char filename_unicode[128] = {0};
char config_filename[] = "location"; //动态文件名。文件内容写入测试
//文件内容
int readlen = 0;
int size = 0;
int written = 0;
char buf_read_from_file[FILE_LEN_MAX] = {0};
int i;
//保存文件的路径不存在时要先创建路径
h = vm_file_mkdir((short *)T_USER_DIR_LOCATION);
dbg_print("T_USER_DIR_LOCATION handle:%d\r\n", h);
if(h >= 0)
{
dbg_print("Creat dir Success.");
vm_file_close(h);
}
// 两种方式:
#if 1 //路径中带L,将文件名转码后拼接成路径
strcat((char *)filename, (char *)config_filename);
strcat((char *)filename, (char *)".txt");
AnsiiToUnicodeString((S8*) filename_unicode, (S8*)filename);
//VMINT vm_wstrcat(VMWSTR dst, const VMWSTR src)
vm_wstrcat((short *)filepath_unicode, (short *)T_USER_DIR_LOCATION);
vm_wstrcat((short *)filepath_unicode, (short *)filename_unicode);
#else //路径中不带L,将路径字符串和文件名拼接好后转码成路径
//创建文件
strcat((char *)filepath, (char *)T_USER_DIR_CONFIG);
//strcat((char *)filepath, (char *)T_USER_DIR_LOCATION);
strcat((char *)filepath, (char *)config_filename);
strcat((char *)filepath, (char *)".txt");
#if 1
for(i = 0; i<strlen(filepath); i++)
{
dbg_print("%c", filepath[i]);
}
dbg_print("\r\n");
#endif
//AnsiiToUnicodeString((S8*) UnicodeName, (S8*)"Z:\\test.txt");
AnsiiToUnicodeString((S8*) filepath_unicode, (S8*)filepath);
#endif
if(vm_file_is_exist((short *)filepath_unicode))
h = (FS_HANDLE)FS_Open( (const WCHAR *)filepath_unicode, FS_READ_WRITE|FS_OPEN_SHARED);
else
h = (FS_HANDLE)FS_Open( (const WCHAR *)filepath_unicode, FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE);
//h = (FS_HANDLE)FS_Open( (const WCHAR *)L"Z:\\@USER\\test.txt", FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE);
//h = (FS_HANDLE)FS_Open( (const WCHAR *)filepath_unicode, FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE);
dbg_print("FS_Open return:%d", h);
// FS_open 正常,进行文件读写测试
if(h >= 0)
{
dbg_print("\tSuccess!\r\n");
FS_GetFileSize(h, &size);
dbg_print("filesize:%d\r\n", size);
if(size > 0)
{
FS_Read(h, (void *)buf_read_from_file, size, &readlen);
dbg_print("readlen:%d\t", readlen);
dbg_print("readcontent:%s\r\n", buf_read_from_file);
}
else
{
//文件为空。
}
FS_Seek(h, 0, FS_FILE_END); //定位到文件末尾,文件指针偏移为0。
FS_Write(h, (void *)config_filename, strlen(config_filename), &written);
dbg_print("write content to file:%s\t", config_filename);
dbg_print("writelen:%d\r\n", written);
FS_Commit(h);
}
else
{
dbg_print("\tFail...\r\n");
}
FS_Close(h);
StartTimer(function_test_timer, 8000, FS_test);
}