📄 filesystem.c
字号:
//no more entries
if (BufSize == 0)
{
break;
}
//隐藏文件不显示
if ( (Info->Attribute & EFI_FILE_HIDDEN)
|| ( StrCmp(Info->FileName,L".") == 0)
|| ( StrCmp(Info->FileName,L"..") == 0))
continue;
//添加一个文件节点
fileitem = (FILEITEM*)MEM_ALLOC(sizeof(FILEITEM));
if(!fileitem)
{
Print(L"alloc memory error!\r\n");
DirHandle->Close(DirHandle);
return;
};
fileitem->Signature = EFI_FILEITEM_SIGNATURE;
StrCpy(fileitem->FileName , Info->FileName);
if (Info->Attribute & EFI_FILE_DIRECTORY)
{
fileitem->bDirectory = TRUE;
}
else
{
fileitem->bDirectory = FALSE;
}
InsertTailList(&this->DirFileList,&fileitem->LinkFile);
}
if (Info)
{
FreePool(Info);
}
DirHandle->Close(DirHandle);
//只有当根目录以下的目录开始时,才需要体添加路径
if ( (StrCmp(DirName, L"..") != 0) && (StrLen(DirName) >0))
{
//添加一个当前当前目录
fileitem = (FILEITEM*)MEM_ALLOC(sizeof(FILEITEM));
fileitem->Signature = EFI_FILEITEM_SIGNATURE;
StrCpy(fileitem->FileName , DirName);
fileitem->bDirectory = TRUE;
InsertTailList(&this->DirFilePathList,&fileitem->LinkFile);
}
}
void ComposeCurDir(struct _FileMgrControl *this,OUT CHAR16 *CurDir, IN INTN CurDirLen)
{
LIST_ENTRY *Link;
FILEITEM *Prot;
ZeroMem(CurDir, CurDirLen);
StrCpy(CurDir,L"\\");
for (Link = this->DirFilePathList.Flink; Link != &this->DirFilePathList; Link = Link->Flink)
{
Prot = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
StrCat(CurDir, Prot->FileName);
StrCat(CurDir, L"\\");
}
}
void GoParentDir(struct _FileMgrControl *this)
{
LIST_ENTRY *Link;
FILEITEM *Prot;
Link = this->DirFilePathList.Blink;
if (Link != &this->DirFilePathList)
{
Prot = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
RemoveEntryList (&Prot->LinkFile);
FreePool(Prot);
}
}
//刷新文件管理器,重新映射
void FileMGR_ReMap(struct _FileMgrControl *this)
{
ClearFSList(this);
// Print(L"ClearFSList\n");
ClearFileList(this);
// Print(L"ClearFileList\n");
ClearFilePathList(this);
// Print(L"ClearFilePathList\n");
this->CurRootFs = NULL;
ListFileSystem(this);
// Print(L"ListFileSystem\n");
DisplayFileSystem(this);
// Print(L"DisplayFileSystem\n");
}
//刷新当前目录的内容
void FileMGR_Refresh(struct _FileMgrControl *this)
{
LIST_ENTRY *Link;
CHAR16 buf[MAX_FILEPATH_LENGTH];
FILEITEM *FileProt;
//如果root fs为空,说明当前在分区列表,不进行目录刷新
if (!this->CurRootFs)
return;
if (IsListEmpty(&this->DirFilePathList))
{
//说明此时正在根目录下面
ListDirFile(this, this->CurRootFs, L"");
}
else
{
//最后一个节点
Link = this->DirFilePathList.Blink;
if (Link != &this->DirFilePathList)
{
FileProt = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
StrCpy(buf, FileProt->FileName);
//先回到上级目录
GoParentDir(this);
//再把当前目录重新打开
ListDirFile(this, this->CurRootFs, buf);
}
}
/*
//往LISTBOX中填写数据
this->ListBox.Clear(&this->ListBox);
// this->ListBox.AddItem(&this->ListBox, L"[..]", 0,PARENT_DIRECTORY);
this->ListBox.AddItem(&this->ListBox, L"..", 0,PARENT_DIRECTORY);
for (Link = this->DirFileList.Flink; Link != &this->DirFileList; Link = Link->Flink)
{
FileProt = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
ZeroMem(buf, MAX_FILEPATH_LENGTH);
if (FileProt->bDirectory)
{
//SPrint(buf, MAX_FILEPATH_LENGTH, L"[%s]", FileProt->FileName);
SPrint(buf, MAX_FILEPATH_LENGTH, L"%s", FileProt->FileName);
}
else
{
SPrint(buf, MAX_FILEPATH_LENGTH, L"%s", FileProt->FileName);
}
this->ListBox.AddItem(&this->ListBox, buf, (UINT32)FileProt,kind);
}
this->ListBox.control.Draw((WndControl*)this);
*/
}
/*
//获取当前的文件路径
EFI_STATUS FileMGR_GetFullPath(struct _FileMgrControl *this,
OUT CHAR16 *FileVolumnName,
OUT CHAR16 *FullPathName,
OUT CHAR16 *FileName, //返回文件名
BOOLEAN *bDirectory, //是否是目录
IN INT32 Length)
{
CHAR16 dirBuf[MAX_FILEPATH_LENGTH];
LIST_ENTRY *Link;
FSITEM *Prot;
FILEITEM *FileProt;
//如果root fs为空,说明当前在分区列表,不进行目录刷新
if (!this->CurRootFs)
return EFI_NOT_FOUND;
//得到当前的文件卷
for (Link = this->FileSystemList.Flink; Link != &this->FileSystemList; Link = Link->Flink)
{
Prot = CR (Link, FSITEM, LinkFS, EFI_FSITEM_SIGNATURE);
if (Prot->RootFs == this->CurRootFs)
StrCpy(FileVolumnName, Prot->FSName);
}
//得到当前目录
ComposeCurDir(this, dirBuf, MAX_FILEPATH_LENGTH);
StrCpy(FullPathName, dirBuf);
//得到当前的文件名
FileProt = (FILEITEM *)this->ListBox.GetItemParam(&this->ListBox, this->ListBox.GetCurSel(&this->ListBox));
if (FileProt)
{
//!!这里必须使用buf作为中间转接,因为在ListDirFile里面,
//将会把所有的FileProt全部释放内存,故参数会变得无效.澹
StrCpy(FileName, FileProt->FileName);
*bDirectory = FileProt->bDirectory;
return EFI_SUCCESS;
}
else
StrCpy(FileName, L""); //可能是..
return EFI_SUCCESS;
}
*/
//根据所给路径,直接打开文件夹并显示
//前提给出的文件名是包含驱动器的完整路径名
//格式如下:
// .\netcfg\yuhu.efi //当前驱动器下的路径
// fs2:\music\lmouse.mp3 //绝对路径
void FileMGR_DisplayDir(struct _FileMgrControl *this, CHAR16 *FullRootFath)
{
//!!这里必须使用buf作为中间转接,因为在ListDirFile里面,
//将会把所有的FileProt全部释放内存,故参数会变得无效.澹
LIST_ENTRY *Link;
//FILEITEM *FileProt;
CHAR16 buf[MAX_FILEPATH_LENGTH];
CHAR16 DriverLabel[20];//驱动器名称,如fs1: , fs3:
INT32 i;
FSITEM *Prot;
EFI_FILE_HANDLE open_RootFs;
if(FullRootFath==NULL)return;//错误的路径名
if(FullRootFath[0]=='.')//打开当前驱动下的目录
{
open_RootFs=this->CurRootFs;
}
else//打开绝对路径
{
//首先获取驱动器名称
for(i=0;(FullRootFath[i]!='\\')&&(FullRootFath[i]!='\0');i++)
DriverLabel[i]=FullRootFath[i];
if(FullRootFath[i]=='\0')return;//错误的路径名
DriverLabel[i]='\0';
for (Link = this->FileSystemList.Flink; Link != &this->FileSystemList; Link = Link->Flink)
{
Prot = CR (Link, FSITEM, LinkFS, EFI_FSITEM_SIGNATURE);
if(StrCmp(Prot->FSLabel,DriverLabel)==0)//找到了对应的驱动器
{
this->CurRootFs = Prot->RootFs;
open_RootFs = Prot->RootFs;
break;
}
}
}
//!!这里必须使用buf作为中间转接,因为在ListDirFile里面,
//将会把所有的FileProt全部释放内存,故参数会变得无效.
//去掉开头的'\\'
while((*FullRootFath!='\\')&&(*FullRootFath!='\0'))FullRootFath++;
if(*FullRootFath=='\0')return;
FullRootFath++;
StrCpy(buf,FullRootFath);
ListDirFile(this,open_RootFs,buf);
this->CurRootFs=open_RootFs;
/*
//往LISTBOX中填写数据
this->ListBox.Clear(&this->ListBox);
//this->ListBox.AddItem(&this->ListBox, L"[..]", 0,PARENT_DIRECTORY);
this->ListBox.AddItem(&this->ListBox, L"..", 0,PARENT_DIRECTORY);
for (Link = this->DirFileList.Flink; Link != &this->DirFileList; Link = Link->Flink)
{
FileProt = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
ZeroMem(buf, MAX_FILEPATH_LENGTH);
if (FileProt->bDirectory)
{
//SPrint(buf, MAX_FILEPATH_LENGTH, L"[%s]", FileProt->FileName);
SPrint(buf, MAX_FILEPATH_LENGTH, L"%s", FileProt->FileName);
}
else
{
SPrint(buf, MAX_FILEPATH_LENGTH, L"%s", FileProt->FileName);
}
this->ListBox.AddItem(&this->ListBox, buf, (UINT32)FileProt,kind);
}
this->ListBox.control.Draw((WndControl*)this);
*/
}
//创建FileMgr
EFI_STATUS CreateFileMgr(FileMgrControl *this)
{
this->ReMap = FileMGR_ReMap;
this->Refresh = FileMGR_Refresh;
this->DisplayDir = FileMGR_DisplayDir;
InitializeListHead (&this->FileSystemList);
InitializeListHead (&this->DirFileList);
InitializeListHead (&this->DirFilePathList);
this->CurRootFs = NULL;
this->FilePathLevel = 0;
CreateContentList(&this->m_ContentList);
return EFI_SUCCESS;
}
//========================================
void ContentList_AddItem(
struct _ContentList *this,
CHAR16 *itemcaption,
UINT32 param,
INT32 data)
{
ContentListITEM *item;
item = (ContentListITEM*)MEM_ALLOC(sizeof( ContentListITEM)) ;
item->Signature = EFI_CONTENTLISTITEM_SIGNATURE;
StrCpy(item->ItemText ,itemcaption);
item->ItemParam = param;
item->ItemData = data;
this->ItemCount ++;
InsertTailList(&this->LinkItems, &item->Link);
}
INTN ContentList_GetCount(struct _ContentList *this)
{
return this->ItemCount;
}
UINT32 ContentList_GetItemParam(struct _ContentList *this, INTN index)
{
LIST_ENTRY *ItemLink;
ContentListITEM *ProtItem;
INTN num=0;
if ( (this->ItemCount>0) && (index>=0) && (index <this->ItemCount))
{
num = 0;
for (ItemLink = this->LinkItems.Flink;
ItemLink != &this->LinkItems;
ItemLink = ItemLink->Flink)
{
//找到该Link节点
if (num == index)
{
break;
}
num++;
}
ProtItem = CR(ItemLink, ContentListITEM, Link, EFI_CONTENTLISTITEM_SIGNATURE);
return ProtItem->ItemParam;
}
return 0;
};
void ContentList_Clear(struct _ContentList *this)
{
LIST_ENTRY *ItemLink,*ItemNextLink;
ContentListITEM *ProtItem;
if (this->ItemCount>0)
{
this->ItemCount = 0; //当前滚动的行数
for (ItemLink = this->LinkItems.Flink;
ItemLink != &this->LinkItems;
ItemLink = ItemNextLink)
{
ItemNextLink = ItemLink->Flink;
ProtItem = CR(ItemLink, ContentListITEM, Link, EFI_CONTENTLISTITEM_SIGNATURE);
RemoveEntryList(&ProtItem->Link);
MEM_FREE(ProtItem);
}
}
}
//查找条款,返回位置
INT32 ContentList_Find(struct _ContentList *this,CHAR16 *pattern,INTN DATA)
{
LIST_ENTRY *ItemLink;
ContentListITEM *ProtItem;
INT32 i;
for (i=0,ItemLink = this->LinkItems.Flink;
ItemLink != &this->LinkItems;
ItemLink = ItemLink->Flink,i++)
{
ProtItem = CR(ItemLink, ContentListITEM, Link, EFI_CONTENTLISTITEM_SIGNATURE);
if((ProtItem->ItemData==DATA)&&(StrCmp(ProtItem->ItemText,pattern)==0))
return i;
}
return -1;
}
//查找目录,返回位置
INT32 FindDirectory(struct _ContentList *this,CHAR16 *DirectoryName)
{
LIST_ENTRY *ItemLink;
ContentListITEM *ProtItem;
INT32 i;
for (i=0,ItemLink = this->LinkItems.Flink;
ItemLink != &this->LinkItems;
ItemLink = ItemLink->Flink,i++)
{
ProtItem = CR(ItemLink, ContentListITEM, Link, EFI_CONTENTLISTITEM_SIGNATURE);
if( (
(ProtItem->ItemData==FILE_DIRECTORY)
||(ProtItem->ItemData==DISKDRIVER)
||(ProtItem->ItemData==PARENT_DIRECTORY)
)
&&(StrCmp(ProtItem->ItemText,DirectoryName)==0))
return i;
}
return -1;
}
//查找条款,返回签名
UINT32 *ContentList_GetItemSignature(struct _ContentList *this,INT32 nIndex)
{
return (UINT32 *)this->GetItemParam(this,nIndex);
}
void CreateContentList(ContentList *this)
{
//ListBox独有的数据
this->ItemCount = 0;
this->AddItem = ContentList_AddItem;
this->GetCount = ContentList_GetCount;
this->GetItemParam = ContentList_GetItemParam;
this->Clear = ContentList_Clear;
this->Find = ContentList_Find;
this->GetItemSignature = ContentList_GetItemSignature;
InitializeListHead(&this->LinkItems);
}
void GoComputerRoot(struct _FileMgrControl *this)//到达最外层,看到驱动器
{
Print(L"Go to computer root\n");
FileMGR_ReMap(this);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -