📄 api.lst
字号:
197 1 return FALSE;
198 1 }
199 BYTE CloseFile()
200 {
201 1 xdata BYTE Cache[512];
202 1 struct _DIR *dir;
203 1 ////////////////////////////////////////////////////////////////////////
204 1 if(ApiFileControl.SectorOffset!=0)
205 1 {
206 2 if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(unsigned char *)BuffFile,TRUE))
207 2 if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(unsigned char *)BuffFile,TRUE))
208 2 return FALSE;
209 2 }
210 1 DelayMs(50);
211 1 if(!Read(ApiFileControl.DirSectorNum,1,Cache))
212 1 if(!Read(ApiFileControl.DirSectorNum,1,Cache))
213 1 return FALSE;
214 1 dir = (struct _DIR *)Cache;
215 1 dir += ApiFileControl.DirIndex;
216 1 ApiFileControl.dir.FileSize=DWordSwap(ApiFileControl.dir.FileSize);
217 1 memcpy(dir, &ApiFileControl.dir, sizeof(struct _DIR));
218 1 DelayMs(50);
219 1 if(!Write(ApiFileControl.DirSectorNum,1,Cache,TRUE))
220 1 if(!Write(ApiFileControl.DirSectorNum,1,Cache,TRUE))
221 1 return FALSE;
222 1 if(FatCache[0][256]!=0)
223 1 {
224 2 if(!Write(FatCache[0][256],1,(BYTE *)FatCache[0],0))
225 2 if(!Write(FatCache[0][256],1,(BYTE *)FatCache[0],0))
226 2 return FALSE;
227 2 }
228 1 return TRUE;
229 1 }
230
231
232 BYTE ReadFile(void* buffer, UINT bytes)
233 {
234 1 BYTE*pCache;
235 1 UINT read_bytes =0;
236 1 UINT max_copy_bytes_in_sector;
237 1 WORD Cluster;
238 1 DWORD FileSize;
239 1 // BYTE buf[600];
240 1 // for(i=0;i<600;i++)
C51 COMPILER V8.08 API 04/25/2009 23:03:21 PAGE 5
241 1 // buf[i]='a';
242 1 // memcpy(buffer,buf,400);
243 1 // return TRUE;
244 1 ////////////////////////////////////////////////////////////////////////
245 1 FileSize = ApiFileControl.dir.FileSize;
246 1 if(bytes>=FileSize)
247 1 bytes=FileSize;
248 1 Cluster=SecToCluster(ApiFileControl.CurrentSectorNum);
249 1 // Sector=ClusterToSec(Cluster);
250 1 ApiFileControl.SectorOffset=ApiFileControl.SectorOffset%(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus);
251 1 for(; ; )
252 1 {
253 2 pCache=BuffFile;
254 2 pCache+=ApiFileControl.SectorOffset;
255 2 if((SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset) > (bytes - read_bytes))
256 2 max_copy_bytes_in_sector = (bytes - read_bytes);
257 2 else
258 2 max_copy_bytes_in_sector=(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset);
259 2 ApiFileControl.SectorOffset+=max_copy_bytes_in_sector;
260 2 if(!Read(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile))
261 2 return FALSE;
262 2 memcpy((char *)buffer, pCache, max_copy_bytes_in_sector);
263 2 // return TRUE;
264 2 read_bytes+=max_copy_bytes_in_sector;
265 2 if(read_bytes>=bytes)
266 2 return TRUE;
267 2 buffer = (char*)buffer + max_copy_bytes_in_sector;
268 2 Cluster=GetListCluster(Cluster);
269 2 ApiFileControl.SectorOffset=0;
270 2 ApiFileControl.CurrentSectorNum=ClusterToSec(Cluster);
271 2
272 2 }//---------end for cycle
273 1 return FALSE;
274 1 }
275
276
277 BYTE SetFileSector(const char * filename,DWORD fileSector,DWORD offset)
278 {
279 1 DWORD FileFirstSector;
280 1 WORD Cluster;
281 1 ////////////////////////////////////////////////////////////////////////
282 1 FileFirstSector=LocateFile(filename, &ApiFileControl);
283 1 if(FileFirstSector==0xffffffff)
284 1 return FALSE;
285 1 ApiFileControl.StartSectorNum = FileFirstSector;
286 1 Cluster=WordSwap(ApiFileControl.dir.FstClusLO);
287 1 for(;;)
288 1 {
289 2 if((GetListCluster(Cluster)==0xffff)||(Cluster==0))
290 2 break;
291 2 Cluster=GetListCluster(Cluster);
292 2 }
293 1 //ApiFileControl.CurrentSectorNum为该簇对应的第一个扇区
294 1 //扇区号移到到了该文件最后一簇的第一个扇区
295 1 if((ClusterToSec(Cluster))>=fileSector>=0)
296 1 ApiFileControl.CurrentSectorNum =fileSector;
297 1 else
298 1 return FALSE;
299 1 ApiFileControl.SectorOffset=offset;
300 1 // ApiFileControl.SectorOffset=(DWordSwap(ApiFileControl.dir.FileSize)%(SimpleBpb.BytsPerSec*SimpleBpb.Sec
-PerClus));
301 1 ApiFileControl.dir.FileSize=DWordSwap(ApiFileControl.dir.FileSize);
C51 COMPILER V8.08 API 04/25/2009 23:03:21 PAGE 6
302 1 return TRUE;
303 1
304 1 }
305 BYTE DisplayFile()
306 {
307 1 WORD i,j=0,k=0;
308 1 BYTE buf[512];
309 1 struct _DIR *dir;
310 1 for(i=0;i<FatParameter.RootDirSectors;i++)
311 1 {
312 2 if(!Read(FatParameter.FirstRootDirSecNum+i,1,buf))
313 2 return FALSE;
314 2 dir=(struct _DIR *)buf;
315 2 for(dir = (struct _DIR *)buf; (BYTE*)dir < buf + SimpleBpb.BytsPerSec; dir++)
316 2 {
317 3 if(dir->Name[0] !='\0')
318 3 {
319 4 // buf=buf+32;
320 4 memcpy((BuffFile+k), (buf+j), 11);
321 4 j+=sizeof(struct _DIR);
322 4 k+=11;
323 4 }
324 3 else if(dir->Name[0]==0)
325 3 return TRUE;
326 3 }
327 2 }
328 1 return FALSE;
329 1 }
330
331
332 BYTE CreateDir(const char * dirname)
333 {
334 1 BYTE Dotname[]={0X2E,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20};
335 1 BYTE DotDotname[]={0x2e,0x2e,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20};
336 1 WORD NewCluster,buf[256];
337 1 struct _DIR dir,*pdir;
338 1 BYTE temp[12],NewDirName[11],NewFileName[12],name[11],Cache[512],path[22],i;
339 1 BYTE * p=temp,*p1=NewFileName,*p2;
340 1 struct _FILE file;
341 1 ////////////////////////////////////////////////////////////////////////
342 1 i=0;
343 1 memset(NewDirName,0,11);
344 1 strcpy(path, dirname);
345 1 while(path[i]!='\\')
346 1 {
347 2
348 2 NewDirName[i]=path[i];
349 2 i++;
350 2 if(i>=strlen(dirname))
351 2 break;
352 2 }
353 1 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
354 1 //核对目录名是否正确
355 1 if(!CheckFileName(NewDirName,p))
356 1 return FALSE;
357 1 //*核对该目录是否已经存在
358 1 if(LocateFile(NewDirName, NULL)!=0xffffffff)
359 1 return FALSE;
360 1 strncpy(name, p, 11);
361 1 memset(&dir, 0, sizeof(dir));
362 1 memcpy(dir.Name, name, 11);
363 1 //定位该目录并获取必要信息
C51 COMPILER V8.08 API 04/25/2009 23:03:21 PAGE 7
364 1 if(!LocateDir(&dir,&file))
365 1 return FALSE;
366 1 //为该目录寻找一个空簇
367 1 NewCluster= SeekEmptyCluster();
368 1 if(NewCluster==0xffff)
369 1 return FALSE;
370 1 //在FAT里标记该簇
371 1 if(!Read((2*NewCluster/SimpleBpb.BytsPerSec)+FatParameter.FirstFatSecNum,1,(BYTE *)buf))
372 1 return FALSE;
373 1 buf[NewCluster%(SimpleBpb.BytsPerSec/2)]=0xfffff;
374 1 if(!Write((2*NewCluster/SimpleBpb.BytsPerSec)+FatParameter.FirstFatSecNum,1,(BYTE *)buf,TRUE))
375 1 return FALSE;
376 1 DelayMs(15);
377 1 //Root dir
378 1 if(!Read(file.DirSectorNum,1,(BYTE *)Cache))
379 1 return FALSE;
380 1 pdir = (struct _DIR *)Cache;
381 1 pdir += file.DirIndex;
382 1 pdir->FstClusLO =WordSwap(NewCluster);
383 1 pdir->FileSize=0;
384 1 pdir->Attr=ATTR_DIRECTORY;
385 1 if(!Write(file.DirSectorNum,1,Cache,TRUE))
386 1 if(!Write(file.DirSectorNum,1,Cache,TRUE))
387 1 return FALSE;
388 1 // dot dir
389 1 memset(Cache,0,512);
390 1 pdir = (struct _DIR *)Cache;
391 1 memset(pdir, 0, sizeof(dir));
392 1 pdir->Attr=ATTR_DIRECTORY;
393 1 pdir->FstClusLO=WordSwap(NewCluster);
394 1 memcpy(pdir->Name, Dotname, 11);
395 1 // dot dot dir;
396 1 pdir++;
397 1 memcpy(pdir->Name, DotDotname, 11);
398 1 pdir->FstClusLO=0;
399 1 for(i=0;i<SimpleBpb.SecPerClus;i++)
400 1 {
401 2 if(!Write(ClusterToSec(NewCluster)+i,1,Cache,TRUE))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -