Пример #1
0
/*********************************************************************************************************
** 函数名称: MakeDir
** 功能描述: 建立目录
**
** 输 入: Path:路径名
**
** 输 出: RETURN_OK:成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: strupr,ClearClus,AddFDT
********************************************************************************************************/
        acoral_u8 MakeDir(acoral_char *Path)
{
    acoral_u32 ClusIndex, Temp1;
    acoral_u8 Drive, Rt;
    FDT temp;
    
    strupr(Path);                       /* 变为大写 */

    ClusIndex = _GetFDTInfo(temp.Name, Path);
    if (ClusIndex == BAD_CLUS)
    {
        return PATH_NOT_FIND;
    }

    Drive = GetDrive(Path);
    
    /* FDT是否存在 */
    Rt = FDTIsLie(Drive, ClusIndex, temp.Name);
    if (Rt != NOT_FIND_FDT)
    {
        return Rt;
    }
    
    /* 不存在 */
    Temp1 = FATAddClus(Drive, 0);               /* 获取目录所需磁盘空间 */
    if ((Temp1 <= EMPTY_CLUS_1) || (Temp1 >= BAD_CLUS))
    {
        /* 没有空闲空间 */
        return  DISK_FULL;
    }

    ClearClus(Drive, Temp1);                /* 清空簇 */
        
        /* 设置FDT属性 */
    temp.Attr = ATTR_DIRECTORY;             
    temp.FileSize = 0;

    temp.NTRes = 0;
    temp.CrtTimeTenth = 0;
    temp.CrtTime = 0;
    temp.CrtDate = 0;
    temp.LstAccDate = 0;
    temp.WrtTime = 0;
    temp.WrtDate = 0;

    temp.FstClusLO = Temp1 & 0xffff;
    temp.FstClusHI = Temp1 / 0x10000;

    Rt = AddFDT(Drive, ClusIndex, &temp);       /* 增加目录项 */
    if (Rt == RETURN_OK)
    {
        /* 建立'.'目录 */
        temp.Name[0] = '.';
        temp.Name[1] = 0x20;
        temp.Name[2] = 0x20;
        temp.Name[3] = 0x20;
        temp.Name[4] = 0x20;
        temp.Name[5] = 0x20;
        temp.Name[6] = 0x20;
        temp.Name[7] = 0x20;
        temp.Name[8] = 0x20;
        temp.Name[9] = 0x20;
        temp.Name[10] = 0x20;
        
        AddFDT(Drive, Temp1, &temp);

        /* 建立'..'目录 */
        temp.Name[1] = '.';
        
        temp.FstClusLO = ClusIndex & 0xffff;
        temp.FstClusHI = ClusIndex / 0x10000;
        Rt = AddFDT(Drive, Temp1, &temp);
    }
    else
    {
        FATDelClusChain(Drive, Temp1);
    }
    
    return Rt;
}
Пример #2
0
/*********************************************************************************************************
** Name        :MakeDir
** Description :create direction
** Input       :Path: DirFileName the path name use the 8.3 format.
** Output      :RETURN_OK:成功
** other reference the return value explain in file fat.h
** global :FileInfo
** call module :AddFDT, GetDirClusIndex
********************************************************************************************************/
IRAM_ENCODE
uint8 MakeDir(uint8 *Path, uint8 *DirFileName)
{
    uint8 Rt;
    uint8 i;
    uint32 ClusIndex, Temp1;
    FDT temp;
    
    StrUprCase(Path);
    ClusIndex = GetDirClusIndex(Path);
    
    Rt = PATH_NOT_FIND;
    if (ClusIndex != BAD_CLUS)
    {
        for (i = 0; i < 11; i++)        //目录项填空格
        {
            temp.Name[i] = ' ';
        }
        
        for (i = 0; i < 11; i++)
        {
            if (*DirFileName == '\0')   //到路径结束
            {
                break;
            }
            
            temp.Name[i] = *DirFileName++;
        }

        /* FDT是否存在 */
        Rt = FDTIsLie(ClusIndex, temp.Name);
        if (Rt == NOT_FIND_FDT)
        {
            /* 不存在 */
            Temp1 = FATAddClus(0);                  /* 获取目录所需磁盘空间 */
            Rt    = DISK_FULL;                      /* 没有空闲空间 */

            if ((Temp1 > EMPTY_CLUS_1) && (Temp1 < BAD_CLUS))
            {
                ClearClus(Temp1);                       /* 清空簇 */

                /* 设置FDT属性 */
                temp.Attr         = ATTR_DIRECTORY;
                temp.FileSize     = 0;
                temp.NTRes        = 0;
                temp.CrtTimeTenth = 0;
                temp.CrtTime      = 0;
                temp.CrtDate      = 0;
                temp.LstAccDate   = 0;
                temp.WrtTime      = 0;
                temp.WrtDate      = 0;
                temp.FstClusLO    = Temp1 & 0xffff;
                temp.FstClusHI    = Temp1 / 0x10000;

                Rt = AddFDT(ClusIndex, &temp);       /* 增加目录项 */
                
                if (Rt == RETURN_OK)
                {
                    /* 建立'.'目录 */
                    temp.Name[0] = '.';
                    for (i = 1; i < 11; i++)
                    {
                        temp.Name[i] = ' ';
                    }
                    AddFDT(Temp1, &temp);

                    /* 建立'..'目录 */
                    temp.Name[1] = '.';
                    if (ClusIndex == BootSector.BPB_RootClus)
                    {
                        ClusIndex = 0;
                    }
                    
                    temp.FstClusLO = ClusIndex & 0xffff;
                    temp.FstClusHI = ClusIndex / 0x10000;
                    Rt = AddFDT(Temp1, &temp);
                }
                else
                {
                    FATDelClusChain(Temp1);
                }
                
                Rt = RETURN_OK;
            }
        }
    }
    
    ///////////////////////////////////////////////////////////
    //回写FAT Cache
    if (gFatCache.Sec!=0 && gFatCache.Flag!=0)
    {
        gFatCache.Flag=0;
        FATWriteSector(gFatCache.Sec, gFatCache.Buf);
    }
    ///////////////////////////////////////////////////////////
    
    return (Rt);
}