?? file.c
字號:
break;
}
}
if (Rt < MAX_OPEN_FILES)
{
fp = FileInfo + Rt;
/* 獲取目錄開始簇號和文件名 */
fp->DirClus = _GetFDTInfo(fp->Name, DirFileName);
if (fp->DirClus < BAD_CLUS)
{
fp->Drive = GetDrive(DirFileName); /* 獲取文件所在邏輯盤號 */
/* 文件已經以讀寫方式打開,不能再次以讀寫方式打開 */
if (FindOpenFileW(fp->Drive, fp->DirClus, fp->Name) == Not_Open_FILE)
{
{
if ((temp.Attr & ATTR_DIRECTORY) != 0)
{
return Not_Open_FILE;
}
if (RemoveFile(DirFileName) != RETURN_OK) /* 刪除文件 */
{
return Not_Open_FILE;
}
}
/* 創建文件 */
for (i = 0; i < 11; i++)
{
temp.Name[i] = fp->Name[i];
}
temp.Attr = 0;
temp.FileSize = 0;
temp.NTRes = 0;
temp.CrtTimeTenth = 0;
temp.CrtTime = 0;
temp.CrtDate = 0;
temp.LstAccDate = 0;
temp.WrtTime = 0;
temp.WrtDate = 0;
temp.FstClusLO = 0;
temp.FstClusHI = 0;
if (AddFDT(fp->Drive, fp->DirClus, &temp) == RETURN_OK) /* 增加文件 */
{
/* 設置文件信息 */
fp->Flags = FILE_FLAGS_READ | FILE_FLAGS_WRITE;
fp->FileSize = 0;
fp->FstClus = 0;
fp->Clus = 0;
fp->Offset = 0;
return Rt;
}
}
}
}
return Not_Open_FILE;
}
/*********************************************************************************************************
** 函數名稱: _FileOpenRW
** 功能描述: 只讀寫方式打開文件,內部使用
**
** 輸 入: DirFileName:用戶使用的文件名
**
** 輸 出: 文件句柄,Not_Open_FILE為不能打開
**
** 全局變量: 無
** 調用模塊: _FileOpenR,_FileOpenW
**
** 作 者: 陳明計
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
HANDLE _FileOpenRW(char *DirFileName)
{
HANDLE Rt;
Rt = _FileOpenR(DirFileName);
if (Rt == Not_Open_FILE)
{
Rt = _FileOpenW(DirFileName);
}
else
{
if (FindOpenFileW(FileInfo[Rt].Drive, FileInfo[Rt].DirClus, FileInfo[Rt].Name) == Not_Open_FILE)
{
FileInfo[Rt].Flags |= (FILE_FLAGS_WRITE | FILE_FLAGS_READ);
}
else
{
FileInfo[Rt].Flags = 0;
Rt = Not_Open_FILE;
}
}
return Rt;
}
/*********************************************************************************************************
** 函數名稱: FileOpen
** 功能描述: 以指定方式打開文件
**
** 輸 入: DirFileName:用戶使用的文件名
** Type:打開方式
** 輸 出: 文件句柄,Not_Open_FILE為不能打開
**
** 全局變量: 無
** 調用模塊: _FileOpenR,_FileOpenW,_FileOpenRW
**
** 作 者: 陳明計
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
HANDLE FileOpen(char *DirFileName, char *Type)
{
HANDLE Rt;
Rt = Not_Open_FILE;
strupr(Type);
strupr(DirFileName);
if (Type[0] == 'R')
{
if (Type[1] == 'W')
{
Rt = _FileOpenRW(DirFileName);
}
else
{
Rt = _FileOpenR(DirFileName);
}
return Rt;
}
if (Type[0] == 'W')
{
if (Type[1] == 'R')
{
Rt = _FileOpenRW(DirFileName);
}
else
{
Rt = _FileOpenW(DirFileName);
}
}
return Rt;
}
/*********************************************************************************************************
** 函數名稱: FileClose
** 功能描述: 關閉指定文件
**
** 輸 入: Handle:文件句柄
**
** 輸 出: RETURN_OK:成功
** 其它參考fat.h中關于返回值的說明
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 FileClose(HANDLE Handle)
{
uint8 Rt;
FDT FileFDT;
MY_FILE *fp;
Rt = PARAMETER_ERR;
if (Handle >= 0 && Handle < MAX_OPEN_FILES)
{
Rt = RETURN_OK;
fp = FileInfo + Handle;
if ((fp->Flags & FILE_FLAGS_WRITE) == FILE_FLAGS_WRITE)
{
Rt = FindFDTInfo(&FileFDT, fp->Drive, fp->DirClus, fp->Name);
if (Rt == RETURN_OK)
if (FileFDT.FileSize < fp->FileSize)
{
FileFDT.FileSize = fp->FileSize;
if (FileFDT.FstClusLO == 0)
if (FileFDT.FstClusHI == 0)
{
FileFDT.FstClusLO = fp->FstClus & 0xffff;
FileFDT.FstClusHI = (fp->FstClus >> 16) & 0xffff;
}
ChangeFDT(fp->Drive, fp->DirClus, &FileFDT);
}
}
fp->Flags = 0;
}
return Rt;
}
/*********************************************************************************************************
** 函數名稱: FileGetCh
** 功能描述: 從文件讀一個字節
**
** 輸 入: Ch:返回讀到的數據
** Handle:文件句柄
** 輸 出: RETURN_OK:成功
** 其它參考fat.h中關于返回值的說明
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 FileGetCh(uint8 *Ch, HANDLE Handle)
{
uint32 i, j, SecIndex;
MY_FILE *fp;
Disk_Info * DiskInfo;
uint8 Rt;
uint8 *Buf;
Rt = PARAMETER_ERR;
fp = FileInfo + Handle;
if (Handle >= 0 && Handle < MAX_OPEN_FILES) /* Handle是否有效 */
if (fp->Flags != 0) /* 對應的打開文件信息表是否已使用 */
{
Rt = FILE_EOF;
if (fp->Offset >= fp->FileSize)
{
/* 如果讀數據超出文件的長度,看一看誰否有別的程序正在寫這個文件 */
/* 如果有,則可能文件的長度有變化,更正之*/
Handle = FindOpenFileW(fp->Drive, fp->DirClus, fp->Name);
if (Handle < MAX_OPEN_FILES)
{
fp->FileSize = FileInfo[Handle].FileSize;
if (fp->Offset == 0)
{
fp->FstClus = FileInfo[Handle].FstClus;
fp->Clus = FileInfo[Handle].Clus;
}
}
}
Rt = FILE_EOF;
if (fp->Offset < fp->FileSize) /* 是否到文件結束 */
{
Rt = NOT_FIND_DISK;
/* 獲取文件所在邏輯盤信息 */
DiskInfo = GetDiskInfo(fp->Drive);
if (DiskInfo != NULL)
{
/* 計算數據所在扇區 */
j = fp->Offset % (DiskInfo->SecPerClus * DiskInfo->BytsPerSec);
i = j / DiskInfo->BytsPerSec;
j = j % DiskInfo->BytsPerSec;
SecIndex = (fp->Clus - 2) * DiskInfo->SecPerClus +
DiskInfo->DataStartSec + i;
Rt = SECTOR_READ_ERR;
/* 打開扇區 */
Buf = OpenSec(fp->Drive, SecIndex);
if (Buf != NULL)
{
/* 讀取扇區數據 */
if (ReadSec(fp->Drive, SecIndex) == RETURN_OK)
{
/* 讀取數據 */
*Ch = Buf[j];
/* 調整文件指針 */
fp->Offset++;
j++;
if (j >= DiskInfo->BytsPerSec)
{
i++;
if (i >= DiskInfo->SecPerClus)
{
fp->Clus = FATGetNextClus(fp->Drive, fp->Clus);
}
}
Rt = RETURN_OK;
}
/* 關閉扇區 */
CloseSec(fp->Drive, SecIndex);
}
}
}
}
return Rt;
}
/*********************************************************************************************************
** 函數名稱: FileRead
** 功能描述: 讀取文件
**
** 輸 入: Buf:保存讀回的數據
** Size:要讀的字節數
** Handle:文件句柄
** 輸 出: 實際讀到的字節數
**
** 全局變量: 無
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -