?? api.c
字號:
//扇區號移到到了該文件最后一簇的第一個扇區
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')
{
// buf=buf+32;
memcpy((BuffFile+k), (buf+j), 11);
j+=sizeof(struct _DIR);
k+=11;
}
else if(dir->Name[0]==0)
return TRUE;
}
}
return FALSE;
}
BYTE CreateDir(const char * dirname)
{
BYTE Dotname[]={0X2E,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20};
BYTE DotDotname[]={0x2e,0x2e,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20};
WORD NewCluster,buf[256];
struct _DIR dir,*pdir;
BYTE temp[12],NewDirName[11],NewFileName[12],name[11],Cache[512],path[22],i;
BYTE * p=temp,*p1=NewFileName,*p2;
struct _FILE file;
////////////////////////////////////////////////////////////////////////
i=0;
memset(NewDirName,0,11);
strcpy(path, dirname);
while(path[i]!='\\')
{
NewDirName[i]=path[i];
i++;
if(i>=strlen(dirname))
break;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
//核對目錄名是否正確
if(!CheckFileName(NewDirName,p))
return FALSE;
//*核對該目錄是否已經存在
if(LocateFile(NewDirName, NULL)!=0xffffffff)
return FALSE;
strncpy(name, p, 11);
memset(&dir, 0, sizeof(dir));
memcpy(dir.Name, name, 11);
//定位該目錄并獲取必要信息
if(!LocateDir(&dir,&file))
return FALSE;
//為該目錄尋找一個空簇
NewCluster= SeekEmptyCluster();
if(NewCluster==0xffff)
return FALSE;
//在FAT里標記該簇
if(!Read((2*NewCluster/SimpleBpb.BytsPerSec)+FatParameter.FirstFatSecNum,1,(BYTE *)buf))
return FALSE;
buf[NewCluster%(SimpleBpb.BytsPerSec/2)]=0xfffff;
if(!Write((2*NewCluster/SimpleBpb.BytsPerSec)+FatParameter.FirstFatSecNum,1,(BYTE *)buf,TRUE))
return FALSE;
DelayMs(15);
//Root dir
if(!Read(file.DirSectorNum,1,(BYTE *)Cache))
return FALSE;
pdir = (struct _DIR *)Cache;
pdir += file.DirIndex;
pdir->FstClusLO =WordSwap(NewCluster);
pdir->FileSize=0;
pdir->Attr=ATTR_DIRECTORY;
if(!Write(file.DirSectorNum,1,Cache,TRUE))
if(!Write(file.DirSectorNum,1,Cache,TRUE))
return FALSE;
// dot dir
memset(Cache,0,512);
pdir = (struct _DIR *)Cache;
memset(pdir, 0, sizeof(dir));
pdir->Attr=ATTR_DIRECTORY;
pdir->FstClusLO=WordSwap(NewCluster);
memcpy(pdir->Name, Dotname, 11);
// dot dot dir;
pdir++;
memcpy(pdir->Name, DotDotname, 11);
pdir->FstClusLO=0;
for(i=0;i<SimpleBpb.SecPerClus;i++)
{
if(!Write(ClusterToSec(NewCluster)+i,1,Cache,TRUE))
return FALSE;
memset(Cache,0,512);
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
//如果目錄且文件名存在則在該目錄下創建一個文件
/////////////////////////////////////////////////////////////////////////////
//分離出文件名
p2=strrchr(path, '\\');
if(p2==NULL)
return TRUE;
memset(NewFileName,0,12);
// memcpy(NewFileName,(),(strlen(dirname)-strlen(NewDirName)+1));
if(!CheckFileName(p2+1,p1))
return FALSE;
strncpy(name, p1, 11);
memset(pdir, 0, sizeof(dir));
// memcpy(dir.Name, name, 11);
// 在數據區寫上文件的頭信息
for(i=0;i<SimpleBpb.SecPerClus;i++)
{
if(!Read(ClusterToSec(NewCluster)+i,1,(BYTE *)Cache))
return 0xffffffff;
pdir=(struct _DIR *)Cache;
for(pdir = (struct _DIR *)Cache; (BYTE*)pdir < Cache + SimpleBpb.BytsPerSec; pdir++)
{
if(pdir->Name[0]=='\0')
{
memcpy((BYTE *)pdir->Name,name,11);
if(!Write(ClusterToSec(NewCluster)+i,1,Cache,TRUE))
return FALSE;
// memcpy(&ApiFileControl.dir.Name,name,11);
memcpy(&ApiFileControl.dir,pdir,sizeof(struct _DIR));
ApiFileControl.StartSectorNum=ClusterToSec(WordSwap(pdir->FstClusLO));
ApiFileControl.SectorOffset=0;
ApiFileControl.DirSectorNum=ClusterToSec(NewCluster)+i;
//ApiFileControl.isDir=1;
// ApiFileControl.dir.FileSize=0;
ApiFileControl.DirIndex = ((BYTE*)pdir - Cache)/sizeof(struct _DIR);
return TRUE;
}
pdir++;
}
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////
//*所有測試工作從這里開始
BYTE ApiDemo(void)
{
// BYTE buf[5120],buf1[1024],buf2[1024];
// WORD i;
////////////////////////////////////////////////////////////////////////
PollDisk(); //首先配置U盤:獲取它的基本信息,測試盤是否已經準備好
//DemlayMs(100); //根據不同情況需要延遲同的時間。
InitFsys(); //讀取FAT信息然,初始化必要的FAT參數
//************************************************************************
//////////////////////////////////////////////////////////////////////////
//
//去調注釋線,打開下函數設置斷點是可測試創建文件
// if(!CreatFile("demo.txt",0x20))
// return FALSE;
//
///////////////////////////////////////////////////////////////////////////
// if(!OpenFile("demo.txt"))
// return FALSE;
//************************************************************************
//測試一:創建一個空文件
//
//去調注釋線,打開下函數設置斷點是可測試創建文件
// if(!CreatFile("demo.txt",0x20))
// return FALSE;
//////////////////////////////////////////////////////////////////////////
//************************************************************************
//測試二:創建文件demo.txt并寫上少量數據
//
// for(i=0;i<5120;i++)
// buf[i]='j';
// if(!CreateFile("demo.txt",0x20))
// return FALSE;
// if(!WriteFile(buf,1000))
// return FALSE;
// if(!CloseFile())
// return FALSE;
/////////////////////////////////////////////////////////////////////////////
//**************************************************************************
//測試三:寫大批量數據
// for(i=0;i<5120;i++)
// buf[i]='c';
// if(!CreateFile("demo.txt",0x20))
// return FALSE;
// for(i=0;i<5;i++)
// if(!WriteFile(buf,1000))
// return FALSE;
// if(!CloseFile())
// return FALSE;
///////////////////////////////////////////////////////////////////////////
//**************************************************************************
//測試四:打開一個文件并在文件后面接著寫上一些少量數據可以精確到到字節
//
// for(i=0;i<5120;i++)
// buf[i]='c';
// if(!OpenFile("demo.txt"))
// return FALSE;
// if(!AddWriteFile(buf,1024))
// return FALSE;
// if(!CloseFile())
// return FALSE;
/////////////////////////////////////////////////////////////////////
//**************************************************************************
//測試五:打開一個文件并在文件后面接著寫上大量數據可以精確到到字節
//
// for(i=0;i<2048;i++)
// buf[i]='h';
// if(!OpenFile("demo.txt"))
// return FALSE;
// if(!AddWriteFile(buf,1024))
// return FALSE;
// for(i=0;i<2048;i++)
// buf[i]='j';
// for(i=0;i<10;i++)
// if(!WriteFile(buf,1000))
// return FALSE;
// if(!CloseFile())
// return FALSE;
//////////////////////////////////////////////////////////////////////////////
//***************************************************************************
//測試六:打開一個文件并讀取數量到緩存buf
//
// if(!OpenFile("demo.txt"))
// return FALSE;
// ApiFileControl.CurrentSectorNum=ApiFileControl.StartSectorNum;
// ApiFileControl.SectorOffset=0;
// if(!ReadFile(buf,500))
// return FALSE;
//////////////////////////////////////////////////////////////////////////////
//****************************************************************************
//測試七:打開一個大文件文件并讀取數量到到多個buf
//
// if(!OpenFile("demo.txt"))
// return FALSE;
// ApiFileControl.CurrentSectorNum=ApiFileControl.StartSectorNum;
// ApiFileControl.SectorOffset=0;
// if(!ReadFile(buf1,500))
// return FALSE;
// if(!ReadFile(buf2,500))
// return FALSE;
///////////////////////////////////////////////////////////////////////////////
//****************************************************************************
//測試八:顯示U盤的文件,執行完后請看全局變量BuffFile里的值
// if(!DisplayFile())
// return FALSE;
///////////////////////////////////////////////////////////////////////////
//***************************************************************************
//測試:九刪除指定的文件
// if(!DelFile("demo.txt"))
// return FALSE;
///////////////////////////////////////////////////////////////////////////////
//**************************************************************************
//測試十:創建一個目錄
// if(!CreateDir("demot"))
// return FALSE;
///////////////////////////////////////////////////////////////////////////////
//********************************************************************************
//測試十一:創建一個目錄同時創建好一個空文件
// if(!CreateDir("www\\demo.txt"))
// return FALSE;
////////////////////////////////////////////////////////////////////////////////////
//***********************************************************************************
//測試十二:創建好一個目錄同時創建一個文件并寫上數據
// for(i=0;i<5120;i++)
// buf[i]='c';
// if(!CreateDir("www\\demo.txt"))
// return FALSE;
// if(!WriteFile(buf,666))
// return FALSE;
// if(!CloseFile())
// return FALSE;
return TRUE;
}
//************************************************************************
//author:dragon
//web:8dragon.com
//2004.2.5完成于桃龍源
//*************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -