⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kw_fat32.lst

📁 linux下数据下载器的设计与实现
💻 LST
📖 第 1 页 / 共 4 页
字号:
 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 + -