使用LCD16032浏览flash中的文件和文件夹
在LCD16032中我已经谈到过我写的这个液晶在wince下的串口驱动,现在我就在上面实现我需要的功能,希望能在上面浏览文件,通过U盘导出里面的文件,或者删除里面的文件!
在wince下有一些用来查找文件的API,第一步就需要使用这些函数来封装一个查询文件的类。实现的基本功能有:超找制定文件,查找一个目录下的文件,创建一个文件夹下面所有文件名的一个文件列表!因为这个液晶和彩色液晶不同,他只能显示黑白,并且只有两行字可以选择!因此在超找文件的时候,我们可以用一个函数来超找一个文件夹下的所有文件名,并保存到一个列表当中去!
具体代码如下”.h”文件
class CCeFindFile
{
public:
CCeFindFile();
virtual ~CCeFindFile();
BOOL FindFile(PTCHAR ptFileName);//查找文件
BOOL CCeFindFile::FindFile(PTCHAR ptFilePath, PTCHAR ptcFileName);
BOOL FindNextFile();//继续查找下一个
void CloseFind();//关闭查找
BOOL FindFileList(PTCHAR ptDirectory, PTCHAR ptSuffixName, DWORD& dwTotalFiles);//查找一个文件夹下的所有文件
BOOL FindDirectoryFolders(PTCHAR ptcDirectory, PFILE_LIST ForSave, DWORD& dwTotalFolder);//查找一个路径下的所有文件夹类型
BOOL GetFileName(PTCHAR ptFileName);//获取文件名
BOOL GetFilePath(PTCHAR ptFilePath);//获取路径
BOOL AddFilePath(const PTCHAR ptFileName, PTCHAR ptFilePath);//将当前路径添加到一个文件名
void GetRootPath(const PTCHAR ptFileName);//获取根目录
BOOL IsDirectory();//判断是否为路径
LPWIN32_FIND_DATA m_pfiledata;
LPWIN32_FIND_DATA m_pNextdata;
PFILE_LIST m_pFileList;
HANDLE m_hFileHandle;
PTCHAR ptRootPath;
};
".cpp”文件如下:
#include "CeFindFile.h"
CCeFindFile::CCeFindFile()
{
m_pfiledata = NULL;
m_pNextdata = NULL;
m_hFileHandle = INVALID_HANDLE_VALUE;
ptRootPath = NULL;
}
CCeFindFile::~CCeFindFile()
{
CloseFind();
}
BOOL CCeFindFile::FindFile(PTCHAR ptFileName)
{
CloseFind();
ptRootPath = new TCHAR[MAX_FILEPATH];
m_pNextdata = new WIN32_FIND_DATA;
GetRootPath(ptFileName);
//查找文件
m_hFileHandle = ::FindFirstFile( ptFileName, m_pNextdata );
DWORD dwlasterror = GetLastError();
if ( m_hFileHandle == INVALID_HANDLE_VALUE )
{//未找到文件
CloseFind();
return FALSE;
}
return TRUE;
}
BOOL CCeFindFile::FindFile(PTCHAR ptFilePath, PTCHAR ptcFileName)
{
TCHAR tcFullPathName[MAX_FILEPATH] = {0};
DWORD dwFullPathLen = wcslen(ptFilePath) - 1;
wcscpy(tcFullPathName, ptFilePath);
if (_T('\\') != tcFullPathName[dwFullPathLen])
wcscat(tcFullPathName, _T("\\"));
wcscat(tcFullPathName, ptcFileName);
if (FALSE == FindFile(tcFullPathName))
return FALSE;
return TRUE;
}
BOOL CCeFindFile::FindNextFile()
{
if (m_hFileHandle == NULL)
return FALSE;
if (m_pfiledata == NULL)
m_pfiledata = new WIN32_FIND_DATA;
LPWIN32_FIND_DATA pTemp = m_pfiledata;
m_pfiledata = m_pNextdata;
m_pNextdata = pTemp;
return ::FindNextFile(m_hFileHandle, m_pNextdata);
}
void CCeFindFile::CloseFind()
{
DELETE_POINTER(m_pfiledata);
DELETE_POINTER(m_pNextdata);
DELETE_POINTER(ptRootPath);
if( m_hFileHandle != NULL && m_hFileHandle != INVALID_HANDLE_VALUE )
{
::FindClose(m_hFileHandle);
m_hFileHandle = NULL;
}
}
//查找一个文件夹下的所有文件,并保存到列表中,
// ptDirectory : 路径 _T("\\CortoiFlash")
// ptSuffixName : 后缀名(_T(".mp3")),NULL表示查找所有
BOOL CCeFindFile::FindFileList(PTCHAR ptDirectory, PTCHAR ptSuffixName, DWORD& dwTotalFiles)
{
TCHAR FileNameForFind[MAX_FILEPATH] = {0};
DWORD i = 0;
m_pFileList = new FILE_LIST[512];
wcscpy(FileNameForFind, ptDirectory);
if (NULL == ptSuffixName)
{
if (_T('\\') == ptDirectory[wcslen(ptDirectory) - 1])
{
wcscat(FileNameForFind, _T("*.*"));
}
else
{
wcscat(FileNameForFind, _T("\\*.*"));
}
}
else
{
FindDirectoryFolders(ptDirectory, m_pFileList, i);
wcscat(FileNameForFind, _T("\\*"));
wcscat(FileNameForFind, ptSuffixName);
}
BOOL bRetValue = FALSE;
bRetValue = FindFile(FileNameForFind);
if (FALSE == bRetValue)
return FALSE;
while (TRUE)
{
bRetValue = FindNextFile();
//////////////////////////////////////////////////////////////////////////
//添加受保护文件名
//////////////////////////////////////////////////////////////////////////
m_pFileList[i].dwFileType = m_pfiledata->dwFileAttributes;
wcscpy(m_pFileList[i].FileName, m_pfiledata->cFileName);
i++;
if (i > 512)
break;
if (FALSE == bRetValue)
{
if (ERROR_NO_MORE_FILES == GetLastError())
break;
else
return FALSE;
}
}
dwTotalFiles = i;
return TRUE;
}
BOOL CCeFindFile::FindDirectoryFolders(PTCHAR ptcDirectory, PFILE_LIST ForSave, DWORD& dwTotalFolder)
{
TCHAR FileNameForFind[MAX_FILEPATH] = {0};
DWORD i = 0;
wcscpy(FileNameForFind, ptcDirectory);
wcscat(FileNameForFind, _T("\\*.*"));
BOOL bRetValue = FALSE;
bRetValue = FindFile(FileNameForFind);
if (FALSE == bRetValue)
return FALSE;
while (TRUE)
{
bRetValue = FindNextFile();
if(IsDirectory())
{
m_pFileList[i].dwFileType = m_pfiledata->dwFileAttributes;
wcscpy(m_pFileList[i].FileName, m_pfiledata->cFileName);
i++;
}
if (i > 512)
break;
if (FALSE == bRetValue)
{
if (ERROR_NO_MORE_FILES == GetLastError())
break;
else
return FALSE;
}
}
dwTotalFolder = i;
return TRUE;
}
BOOL CCeFindFile::GetFileName(PTCHAR ptFileName)
{
if (m_pfiledata != NULL)
wcscpy(ptFileName, m_pfiledata->cFileName);
else
return FALSE;
return TRUE;
}
BOOL CCeFindFile::GetFilePath(PTCHAR ptFilePath)
{
if (m_pfiledata != NULL)
{
wcscpy(ptFilePath, ptRootPath);
wcscat(ptFilePath, m_pfiledata->cFileName);
}
else
{
return FALSE;
}
return TRUE;
}
BOOL CCeFindFile::AddFilePath(const PTCHAR ptFileName, PTCHAR ptFilePath)
{
wcscpy(ptFilePath, ptRootPath);
wcscat(ptFilePath, ptFileName);
return TRUE;
}
void CCeFindFile::GetRootPath(const PTCHAR ptFileName)
{
INT i = 0;
DWORD dwStrLen = wcslen(ptFileName);
wcscpy(ptRootPath, ptFileName);
for (i = dwStrLen; i > 0; i--)
{
if (ptRootPath[i] == _T('\\'))
{
break;
}
else
{
ptRootPath[i] = 0;
}
}
}
BOOL CCeFindFile::IsDirectory()
{
if (m_pfiledata != NULL)
{
if(m_pfiledata -> dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
return TRUE;
else
return FALSE;
}
return FALSE;
}
注意,查找出来的文件全都只有文件名称,不是完整的路径,因此我们要操作一个文件的时候需要使用到刚开始打开的那个类里面的路径,添加到文件路径之后,才能经行正常的使用!并且我在处理的时候为了方便我现在使用的硬件,LCD16032,所以在文件名长度上做了一些设置,比如一个文件最长是多长!
对于这样一个没有键盘,没有鼠标的系统来说,我们使用这个浏览flash中的文件是非常有用的,文件浏览成功之后,我们可以使用这些名字来对相应的文件进行操作!
在我现在所使用的系统中,我使用U盘来进行升级,在U盘上安排好文件的存放规则,以及文件命名等,然后通过简单的几个按键就可以实现应用程序的升级,删除,导出文件等操作!这对一些没有界面或者键盘的系统来说是很方便的!
这些操作都可以使用wince的API:
MoveFile: 重命名
CopyFile: 复制文件
DeleteFile: 删除文件
这些操作就可以基本可以实现上诉功能!