📄 kw_fat32.lst
字号:
191 3 if( sFileName[0] == pDir->FileName[0] && sFileName[1] == pDir->FileName[1]
192 3 && sFileName[2] == pDir->FileName[2] && sFileName[3] == pDir->FileName[3]
193 3 && sFileName[4] == pDir->FileName[4] && sFileName[5] == pDir->FileName[5]
194 3 && sFileName[6] == pDir->FileName[6] && sFileName[7] == pDir->FileName[7]
195 3 && pDir->ExtName[0] == sFileName[9] && pDir->ExtName[1] == sFileName[10]
196 3 && pDir->ExtName[2] == sFileName[11])
197 3 {
198 4 FM_CurrentDirLBA = FM_ptr_root + i;
199 4 FM_pCurrentDir = pDir;
200 4 return pDir; //文件找到,返回目录项
201 4 }
202 3 pDir ++;
203 3 }
204 2 }
205 1
206 1 //当文件无法找到,即文件不存在,则创建
207 1
208 1 if(tmpLBA != 0) //LBA地址不为0说明前面找到了一个空目录项
209 1 {
210 2
211 2 StartClu = FM_GetFreeClu(); //分配一个空簇
212 2 while(StartClu == 0 || StartClu > 0xf900)
213 2 {
214 3 FM_DeleteFirstFile(); //若无法分配空簇则删除文件
215 3 StartClu = FM_GetFreeClu();
216 3 }
217 2
218 2
219 2 FM_CurrentDirLBA = tmpLBA; //保存扇区 LBA地址
220 2
221 2 NM_ReadPage(FM_CurrentDirLBA); //打开目录项所在LBA扇区
222 2
223 2 for(i=0;i<8;i++) //复制文件名
224 2 FM_pCurrentDir->FileName[i] = sFileName[i];
225 2
226 2 FM_pCurrentDir->ExtName[0] = sFileName[9]; //扩展名
227 2 FM_pCurrentDir->ExtName[1] = sFileName[10];
228 2 FM_pCurrentDir->ExtName[2] = sFileName[11];
229 2
230 2 FM_pCurrentDir->StartClus[0] = StartClu & 0xff; //设置起始簇地址
231 2 FM_pCurrentDir->StartClus[1] = (StartClu >>8 )& 0xff;
232 2
233 2 FM_pCurrentDir->FileLength[0] = 0; //设置新文件长度为0
234 2 FM_pCurrentDir->FileLength[1] = 0;
235 2 FM_pCurrentDir->FileLength[2] = 0;
236 2 FM_pCurrentDir->FileLength[3] = 0;
237 2
238 2 FM_pCurrentDir->attribute = 0; //设置文件属性
239 2
240 2 RM_ReadRTCTime(); //获取RTC时间
C51 COMPILER V7.50 KW_FAT32 10/12/2007 17:05:47 PAGE 5
241 2 i = RM_GetTimeForFAT();
242 2 FM_pCurrentDir->time[0] = i&0xff; //设置文件时间
243 2 FM_pCurrentDir->time[1] = (i>>8)&0xff;
244 2 i = RM_GetDateForFAT();
245 2 FM_pCurrentDir->date[0] = i&0xff; //设置文件日期
246 2 FM_pCurrentDir->date[1] = (i>>8)&0xff;
247 2
248 2 NM_WritePages(FM_CurrentDirLBA); //写文件到目录项中
249 2 return FM_pCurrentDir;
250 2 }
251 1 return 0;
252 1 }
253
254 /*************************************************************************************
255 Function: FM_GetNextClus
256 Description: 获取指定簇的下一簇
257 Called By:
258 Input: c @ WORD: 当前簇
259 Output: N/A
260 Return: 下簇地址
261 Others:
262 *************************************************************************************/
263 WORD FM_GetNextClus(WORD c)
264 {
265 1 WORD xdata * pTmp;
266 1
267 1 NM_ReadPage(FM_ptr_fats+((c>>8)&0xff)); //计算当前簇LBA地址并读取
268 1 pTmp = (WORD *)EP6FIFOBUF; //获取簇号
269 1 return (pTmp[c&0xff]>>8 & 0xff) | (pTmp[c&0xff]<<8 & 0xff00); //自己排列
270 1 }
271
272 /*************************************************************************************
273 Function: FM_GetFormatedSize
274 Description: 计算剩余容量,簇数量
275 Called By:
276 Input: N/A
277 Output: N/A
278 Return: void
279 Others: 该函数不使用
280 *************************************************************************************/
281 /*
282 void FM_GetFormatedSize()
283 {
284 DWORD xdata i,j;
285 WORD xdata * pTmp;
286 FM_unuse_clus = 0;
287 for(i = 0; i < FM_sectors_fat; i++)
288 {
289 NM_ReadPage(FM_ptr_fats + i);
290 pTmp = (WORD * )(&EP6FIFOBUF[0]);
291 for(j=0;j<512/2;j++)
292 {
293 if(*pTmp == 0x0000)
294 FM_unuse_clus++;
295 pTmp++;
296 }
297 }
298 }
299 */
300
301 /*************************************************************************************
302 Function: FM_DeleteCluLink
C51 COMPILER V7.50 KW_FAT32 10/12/2007 17:05:47 PAGE 6
303 Description: 删除簇链,用于删除文件
304 Called By:
305 Input: nStart@Word:簇链起始号
306 Output: N/A
307 Return: void
308 Others: 无意义
309 *************************************************************************************/
310 bit FM_DeleteCluLink(WORD nStart)
311 {
312 1 WORD xdata nTmp;
313 1 WORD xdata * pBuffStart = (WORD *)EP6FIFOBUF;
314 1 NM_ReadPage(FM_ptr_fats+((nStart>>8)&0xff)); //获取首簇LBA,并读取
315 1 while(nStart != 0xffff) //直到簇链结束
316 1 {
317 2 if(pBuffStart[nStart & 0xff] == 0xffff) //若下簇为簇链尾
318 2 {
319 3 pBuffStart[nStart & 0xff] = 0x0000; //置空
320 3 NM_WritePages(FM_ptr_fats+((nStart>>8)&0xff)); //回写
321 3 return 1;
322 3 }
323 2 else
324 2 {
325 3 //如果当前簇和下一簇都在同一扇区,则直接置空当前簇
326 3 if(((nStart >> 8)&0xff) == (pBuffStart[nStart&0xff] & 0xff))
327 3 {
328 4 nTmp = (pBuffStart[nStart&0xff]>>8 & 0xff) | (pBuffStart[nStart&0xff]<<8 & 0xff00);
329 4 pBuffStart[nStart&0xff] = 0x0000;
330 4 nStart = nTmp;
331 4 }
332 3 //否则,置空当前簇,并读取下簇LBA扇区
333 3 else
334 3 {
335 4 nTmp = (pBuffStart[nStart&0xff]>>8 & 0xff) | (pBuffStart[nStart&0xff]<<8 & 0xff00);
336 4 pBuffStart[nStart&0xff] = 0x0000;
337 4 NM_WritePages(FM_ptr_fats+((nStart>>8)&0xff));
338 4 nStart = nTmp;
339 4 NM_ReadPage(FM_ptr_fats+((nStart>>8)&0xff));
340 4 }
341 3 }
342 2 }
343 1 }
344
345 /*************************************************************************************
346 Function: FM_DeleteFileInRoot
347 Description: 删除根目录文件
348 Called By:
349 Input: sFileName@BYTE*:文件名
350 Output: N/A
351 Return: 1:成功,0:失败
352 Others: 无意义
353 *************************************************************************************/
354 bit FM_DeleteFileInRoot(BYTE * sFileName)
355 {
356 1 DWORD xdata i,j;
357 1 Dir_tag xdata * pDir;
358 1
359 1 //首先找到文件,具体可参考打开文件代码
360 1 for(i=0; i<((32 * FM_dirs_fat) / 512); i++)
361 1 {
362 2 NM_ReadPage(FM_ptr_root + i);
363 2 pDir = ((Dir_tag * ) (& EP6FIFOBUF[0]));
364 2
C51 COMPILER V7.50 KW_FAT32 10/12/2007 17:05:47 PAGE 7
365 2 for(j=0;j<16;j++)
366 2 {
367 3 if(pDir->FileName[0] == 0x00 || pDir->FileName[0] == 0xe5) //FileName[0]
368 3 {
369 4 pDir ++;
370 4 continue;
371 4 }
372 3 if(pDir->attribute & 0x18)
373 3 {
374 4 pDir ++;
375 4 continue;
376 4 }
377 3 if( sFileName[0] == pDir->FileName[0] && sFileName[1] == pDir->FileName[1]
378 3 && sFileName[2] == pDir->FileName[2] && sFileName[3] == pDir->FileName[3]
379 3 && sFileName[4] == pDir->FileName[4] && sFileName[5] == pDir->FileName[5]
380 3 && sFileName[6] == pDir->FileName[6] && sFileName[7] == pDir->FileName[7]
381 3 && sFileName[9] == pDir->ExtName[0] && sFileName[10] == pDir->ExtName[1]
382 3 && sFileName[11] == pDir->ExtName[2] )
383 3 {
384 4 //文件被找到
385 4 pDir->FileName[0] = 0xe5; //置删除标志
386 4 j = (pDir->StartClus[0]) | (pDir->StartClus[1] << 8); //说去首簇
387 4 NM_WritePages(FM_ptr_root + i); //回写
388 4 if(j != 0)
389 4 FM_DeleteCluLink(j); //删除簇链
390 4 return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -