?? api.#2
字號:
//************************************************************************
//author:dragon
//web:8dragon.com
//2004.2.5完成于桃龍?jiān)?//*************************************************************************
#include "AT89X52.h"
#include "api.h"
#include "file.h"
#include "host_811.h"
#include "ufi.h"
#include "string.h"
#include "math.h"
struct _FILE ApiFileControl;
extern struct _BPB SimpleBpb;
extern FAT_PARAMETER FatParameter;
BYTE BuffFile[8*512];
extern WORD FatCache[2][256];
BYTE CreateFile(char* filename, BYTE attribute)
{
struct _DIR dir,*pdir;
BYTE name[11];
struct _FILE file;
// WORD NewCluster;
BYTE Cache[512];
static char NewFileName[12];
char * p=NewFileName;
////////////////////////////////////////////////////////////////////////
//*Get valid filen name
if(!CheckFileName(filename,p))
return FALSE;
//*核對該文件是否已經(jīng)存在
if(LocateFile(filename, NULL)!=0xffffffff)
return FALSE;
strncpy(name, p, 11);
memset(&dir, 0, sizeof(dir));
memcpy(dir.Name, name, 11);
dir.Attr = attribute;
dir.CrtDate =0;
dir.CrtTime =0;
dir.CrtTimeTenth =0;
dir.FileSize =0;
DelayMs(5);
if(!LocateDir(&dir, &file))
return FALSE;
// NewCluster=SeekEmptyCluseter();
// if(NewCluster==0xffff)
// return FALSE;
DelayMs(15);
if(!Read(file.DirSectorNum,1,(BYTE *)Cache))
return FALSE;
pdir = (struct _DIR *)Cache;
pdir += file.DirIndex;
pdir->FstClusLO =0x00;//WordSwap(NewCluster);
pdir->FileSize=0;
if(!Write(file.DirSectorNum,1,Cache,TRUE))
if(!Write(file.DirSectorNum,1,Cache,TRUE))
return FALSE;
return OpenFile(filename);
}
BYTE WriteFile(const char* buffer, UINT bytes)
{
BYTE *pCache;
WORD Cache[512];
UINT write_bytes =0,flag=0;
UINT max_write_bytes_in_sector;
WORD Cluster;
////////////////////////////////////////////////////////////////////////
//如果打開的文件是一個空文件,則進(jìn)入下面
//為其尋找一個開始的數(shù)據(jù)蔟,標(biāo)記為0xffff
//數(shù)據(jù)直接填在該簇對應(yīng)的扇區(qū)內(nèi)
if(ApiFileControl.StartSectorNum<FatParameter.FirstDataSector)
{
Cluster=SeekEmptyCluster();
if(!Read(FatParameter.FirstFatSecNum+(2*Cluster/SimpleBpb.BytsPerSec),1,(BYTE *)Cache))
return FALSE;
Cache[Cluster%(SimpleBpb.BytsPerSec/2)]=0xffff;
if(!Write(FatParameter.FirstFatSecNum+(2*Cluster/SimpleBpb.BytsPerSec),1,(BYTE *)Cache,0))
return FALSE;
ApiFileControl.dir.FstClusLO=WordSwap(Cluster);
ApiFileControl.StartSectorNum=ApiFileControl.CurrentSectorNum=ClusterToSec(Cluster);
flag=1;
}
///////////////////////////////////////////////////////////////////////////////
//
//如過前一個WriteFile函數(shù)的字節(jié)或者打開一個已經(jīng)有為內(nèi)容的文件的字節(jié)偏移剛好為
//SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus的整數(shù)倍,為了保持總的算法一致
//(都是先寫好某簇為0xffff然后再寫該簇的內(nèi)容)則開始的時候必須先為其準(zhǔn)備好
//一個未有內(nèi)容的簇,標(biāo)記好為0xffff,然后數(shù)據(jù)直接填在該簇對應(yīng)的扇區(qū)內(nèi)。
//
//////////////////////////////////////////////////////////////////////////////
if((ApiFileControl.SectorOffset==0)&&flag==0)
{
Cluster =LinkClusterList(SecToCluster(ApiFileControl.CurrentSectorNum));
if(Cluster == 0xffff)
return FALSE;
ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);
}
for(;;)
{
pCache=BuffFile;//Cache;
pCache += ApiFileControl.SectorOffset;
if((SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset) > (bytes - write_bytes))
max_write_bytes_in_sector = (bytes - write_bytes);
else
max_write_bytes_in_sector=(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset);
memcpy(pCache, buffer, max_write_bytes_in_sector);
ApiFileControl.SectorOffset += max_write_bytes_in_sector;
if(ApiFileControl.SectorOffset>=SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus)
{
if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE*)BuffFile,FALSE))
if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE*)BuffFile,FALSE))
return FALSE;
if((write_bytes+max_write_bytes_in_sector)<bytes)
{
Cluster =LinkClusterList(SecToCluster(ApiFileControl.CurrentSectorNum));
if(Cluster == 0xffff)
return FALSE;
ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);
}
ApiFileControl.SectorOffset = 0;
}
write_bytes += max_write_bytes_in_sector;
buffer = (char*)buffer + max_write_bytes_in_sector;
ApiFileControl.dir.FileSize += max_write_bytes_in_sector;
if(write_bytes >= bytes)
return TRUE;
}//end for cycle
return FALSE;
}
BYTE AddWriteFile(const char* buffer, UINT bytes)
{
UINT write_bytes =0;
UINT max_write_bytes_in_sector;
////////////////////////////////////////////////////////////////////////
// WORD Cluster;
// DWORD Sector;
BYTE *pCache;
// BYTE BuffFile[4*512];
/////////////////////////////////////////////////////////////////////////////
//
//****如果文件的大小不是SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus
//的整數(shù)倍,則進(jìn)入下面的語句可以保證加寫的東西精確到到字節(jié)
//
//////////////////////////////////////////////////////////////////////////////
if(0<ApiFileControl.SectorOffset<SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus)
{
pCache=BuffFile;
if((SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset) > (bytes - write_bytes))
max_write_bytes_in_sector = (bytes - write_bytes);
else
max_write_bytes_in_sector=(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset);
// Cluster=SecToCluster(ApiFileControl.CurrentSectorNum);
// Sector=ClusterToSec(Cluster);
if(!Read(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile))
return FALSE;
pCache += ApiFileControl.SectorOffset;
memcpy(pCache, buffer, max_write_bytes_in_sector);
if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile,TRUE))
if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile,TRUE))
return FALSE;
write_bytes += max_write_bytes_in_sector;
buffer = (char*)buffer + max_write_bytes_in_sector;
ApiFileControl.dir.FileSize += max_write_bytes_in_sector;
if((bytes-max_write_bytes_in_sector)>0)
ApiFileControl.SectorOffset=0;
}
if(!WriteFile(buffer,(bytes -write_bytes)))
return FALSE;
return TRUE;
}
BYTE OpenFile(const char* filename)
{
DWORD FileFirstSector;
WORD Cluster;
////////////////////////////////////////////////////////////////////////
FileFirstSector=LocateFile(filename, &ApiFileControl);
if(FileFirstSector==0xffffffff)
return FALSE;
ApiFileControl.StartSectorNum = FileFirstSector;
Cluster=WordSwap(ApiFileControl.dir.FstClusLO);
for(;;)
{
if((GetListCluster(Cluster)==0xffff)||(Cluster==0))
break;
Cluster=GetListCluster(Cluster);
}
//ApiFileControl.CurrentSectorNum為該簇對應(yīng)的第一個扇區(qū)
ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);
ApiFileControl.SectorOffset=(DWordSwap(ApiFileControl.dir.FileSize)%(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus));
ApiFileControl.dir.FileSize=DWordSwap(ApiFileControl.dir.FileSize);
return TRUE;
}
BYTE ReadFile(void* buffer, UINT bytes)
{
BYTE*pCache;
UINT read_bytes =0;
UINT max_copy_bytes_in_sector;
WORD Cluster,i;
DWORD FileSize;
// BYTE buf[600];
// for(i=0;i<600;i++)
// buf[i]='a';
// memcpy(buffer,buf,400);
// return TRUE;
////////////////////////////////////////////////////////////////////////
FileSize = ApiFileControl.dir.FileSize;
if(bytes>=FileSize)
bytes=FileSize;
Cluster=SecToCluster(ApiFileControl.CurrentSectorNum);
// Sector=ClusterToSec(Cluster);
ApiFileControl.SectorOffset=ApiFileControl.SectorOffset%(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus);
for(; ; )
{
pCache=BuffFile;
pCache+=ApiFileControl.SectorOffset;
if((SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset) > (bytes - read_bytes))
max_copy_bytes_in_sector = (bytes - read_bytes);
else
max_copy_bytes_in_sector=(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset);
ApiFileControl.SectorOffset+=max_copy_bytes_in_sector;
if(!Read(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile))
return FALSE;
memcpy((char *)buffer, pCache, max_copy_bytes_in_sector);
// return TRUE;
read_bytes+=max_copy_bytes_in_sector;
if(read_bytes>=bytes)
return TRUE;
buffer = (char*)buffer + max_copy_bytes_in_sector;
Cluster=GetListCluster(Cluster);
ApiFileControl.SectorOffset=0;
ApiFileControl.CurrentSectorNum=ClusterToSec(Cluster);
}//---------end for cycle
return FALSE;
}
BYTE CloseFile()
{
BYTE Cache[512];
struct _DIR *dir;
////////////////////////////////////////////////////////////////////////
if(ApiFileControl.SectorOffset!=0)
{
if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(unsigned char *)BuffFile,TRUE))
if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(unsigned char *)BuffFile,TRUE))
return FALSE;
}
DelayMs(50);
if(!Read(ApiFileControl.DirSectorNum,1,Cache))
if(!Read(ApiFileControl.DirSectorNum,1,Cache))
return FALSE;
dir = (struct _DIR *)Cache;
dir += ApiFileControl.DirIndex;
ApiFileControl.dir.FileSize=DWordSwap(ApiFileControl.dir.FileSize);
memcpy(dir, &ApiFileControl.dir, sizeof(struct _DIR));
DelayMs(50);
if(!Write(ApiFileControl.DirSectorNum,1,Cache,TRUE))
if(!Write(ApiFileControl.DirSectorNum,1,Cache,TRUE))
return FALSE;
if(FatCache[0][256]!=0)
{
if(!Write(FatCache[0][256],1,(BYTE *)FatCache[0],0))
if(!Write(FatCache[0][256],1,(BYTE *)FatCache[0],0))
return FALSE;
}
return TRUE;
}
BYTE SetFileSector(const char * filename,DWORD fileSector,DWORD offset)
{
DWORD FileFirstSector;
WORD Cluster;
////////////////////////////////////////////////////////////////////////
FileFirstSector=LocateFile(filename, &ApiFileControl);
if(FileFirstSector==0xffffffff)
return FALSE;
ApiFileControl.StartSectorNum = FileFirstSector;
Cluster=WordSwap(ApiFileControl.dir.FstClusLO);
for(;;)
{
if((GetListCluster(Cluster)==0xffff)||(Cluster==0))
break;
Cluster=GetListCluster(Cluster);
}
//ApiFileControl.CurrentSectorNum為該簇對應(yīng)的第一個扇區(qū)
//扇區(qū)號移到到了該文件最后一簇的第一個扇區(qū)
if((ClusterToSec(Cluster))>=fileSector>=0)
ApiFileControl.CurrentSectorNum =fileSector;
else
return FALSE;
ApiFileControl.SectorOffset=offset;
// ApiFileControl.SectorOffset=(DWordSwap(ApiFileControl.dir.FileSize)%(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus));
ApiFileControl.dir.FileSize=DWordSwap(ApiFileControl.dir.FileSize);
return TRUE;
}
BYTE DisplayFile()
{
WORD i,j=0,k=0;
BYTE buf[512];
struct _DIR *dir;
for(i=0;i<FatParameter.RootDirSectors;i++)
{
if(!Read(FatParameter.FirstRootDirSecNum+i,1,buf))
return FALSE;
dir=(struct _DIR *)buf;
for(dir = (struct _DIR *)buf; (BYTE*)dir < buf + SimpleBpb.BytsPerSec; dir++)
{
if(dir->Name[0] !='\0')
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -