?? dir.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發展有限公司
** 研 究 所
** ARM開發組
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: dir.c
**創 建 人: 陳明計
**最后修改日期: 2003年9月9日
**描 述: FAT文件系統的目錄基本操作程序
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 陳明計
** 版 本: V1.0
** 日 期: 2003年9月8日
** 描 述: 原始版本
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 陳明計
** 日 期: 2004年4月10日
** 描 述: 增加注釋
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_DIR
#include "config.h"
static uint8 CurrentDrive;
char *strupr(char *Str)
{
char *cp;
cp = Str;
while(*cp!=0)
{
if(*cp>='a'&&*cp<='z')
{
*cp-='a'-'A';
}
cp++;
}
return Str;
}
uint32 GetDirClusIndex(char *Path);
/*********************************************************************************************************
** 函數名稱: StrToFDTName
** 功能描述: 用戶文件\目錄名轉換為系統名
**
** 輸 入: Str:用戶名稱
**
** 輸 出: 驅動器號
**
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 StrToFDTName(char *FDTName, char *Str)
{
uint8 i, temp;
/* 文件\目錄名是否有效 */
if (Str[0] == 0x20 || Str[0] == 0)
{
return FILE_NAME_ERR;
}
for (i = 11; i != 0; i--)
{
*FDTName++ = 0x20;
}
FDTName -= 11;
/* 是否為"." */
if (Str[0] == '.')
if (Str[1] == 0 || Str[1] == '\\')
{
FDTName[0] = '.';
return RETURN_OK;
}
/* 是否為".." */
if (Str[0] == '.')
if (Str[1] == '.' )
if (Str[2] == 0 || Str[2] == '\\')
{
FDTName[0] = '.';
FDTName[1] = '.';
return RETURN_OK;
}
/* 獲取主文件/目錄名 */
for (i = 8; i != 0; i--)
{
temp = *Str;
if (temp == 0 || temp == '\\')
{
break;
}
Str++;
if (temp == '.')
{
break;
}
*FDTName++ = temp;
}
FDTName += i;
/* 獲取文件\目錄擴展名 */
for (i = 3; i != 0; i--)
{
temp = *Str;
if (temp == 0 || temp == '\\')
{
break;
}
Str++;
*FDTName++ = temp;
}
return RETURN_OK;
}
/*********************************************************************************************************
** 函數名稱: _GetFDTInfo
** 功能描述: 獲取FDT所在的目錄的開始簇號及系統內名稱,內部使用
**
** 輸 入: DirFileName:用戶使用的FDT名(包括路徑)
** FDTName:用于返回系統使用的FDT名(不包括路徑)
** 輸 出: FDT所在的目錄的開始簇號,BAD_CLUS表示找不到路徑
**
** 全局變量: 無
** 調用模塊: GetDirClusIndex,StrToFDTName
**
** 作 者: 陳明計
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 _GetFDTInfo(char *FDTName,char *DirFileName)
{
uint32 Re;
char *temp;
uint8 i;
/* 獲取字符串結束位置 */
temp = DirFileName;
while(*temp!=0)
{
temp++;
}
temp--;
if(*temp=='\\') /* 最后字符為\不是有效文件/目錄名 */
{
return BAD_CLUS;
}
/* 獲取目錄開始簇號 */
Re = BAD_CLUS;
while(1)
{
if(*temp =='\\'||*temp ==':')
{
/* 找到目錄分割符號'\' 或 */
/* 找到邏輯盤分割符號':',表明是指定邏輯盤當前目錄 */
temp++;
i = *temp;
*temp = 0;
Re = GetDirClusIndex(DirFileName);
*temp = i;
break;
}
if(temp==DirFileName)
{
/* 只有文件\目錄名,表明是當前邏輯盤當前目錄 */
Re = GetDirClusIndex(".");
break;
}
temp--;
}
/* 獲取系統內文件\目錄名 */
if(StrToFDTName(FDTName,temp)!=RETURN_OK)
{
Re = BAD_CLUS;
}
return Re;
}
/*********************************************************************************************************
** 函數名稱: GetDrive
** 功能描述: 獲取指定目錄的驅動器
**
** 輸 入: Path:路徑名
**
** 輸 出: 驅動器號
**
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GetDrive(char *Path)
{
uint8 Drive;
Drive = CurrentDrive;
if(Path!=NULL)
{
strupr(Path); /* 變為大寫 */
if(Path[1]==':')
{
Drive = Path[0]-'A';
}
}
return Drive;
}
/*********************************************************************************************************
** 函數名稱: ChangeDrive
** 功能描述: 改變當前邏輯盤
**
** 輸 入: Drive:邏輯盤符字符串
**
** 輸 出: RETURN_OK:成功
** NOT_FIND_DISK:邏輯盤不存在
** PARAMETER_ERR:非法參數
** 全局變量: 無
** 調用模塊: strupr,GetDiskInfo
**
** 作 者: 陳明計
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ChangeDrive(char *Drive)
{
uint8 Rt;
Disk_Info *Disk;
Rt = PARAMETER_ERR;
strupr(Drive); /* 變為大寫 */
if(Drive[1]==':')
{
Rt = NOT_FIND_DISK;
Disk = GetDiskInfo(Drive[0]-'A');
if(Disk!=NULL)
{
CurrentDrive=Drive[0]-'A';
Rt = RETURN_OK;
}
}
return Rt;
}
/*********************************************************************************************************
** 函數名稱: GetDirClusIndex
** 功能描述: 獲取指定目錄開始簇號
**
** 輸 入: Path:路徑名
**
** 輸 出: 開始簇號,EMPTY_CLUS:為根目錄
**
** 全局變量: 無
** 調用模塊: strupr,GetDiskInfo,FindFDTInfo
**
** 作 者: 陳明計
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 GetDirClusIndex(char *Path)
{
char DirName[12];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -