Example #1
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);
}
Example #2
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;
}
Example #3
0
/******************************************************************************
** 函数名称: _FileOpenW
** 功能描述: 只写方式打开文件,内部使用
**
** 输 入: DirFileName:用户使用的文件名
**
** 输 出: 文件句柄,Not_Open_FILE为不能打开
**         
** 全局变量: FileInfo
** 调用模块: _GetFDTInfo,FindFDTInfo
**
*****************************************************************************/
HANDLE _FileOpenW(Int8 *DirFileName)
{
    MY_FILE *fp;
    FDT temp;
    HANDLE Rt;
    Uint8 i;
    SYS_TIME CurTime,CrtTime;	// 保存当前时间日期

    /* 查找空闲文件登记项 */
    for (Rt = 0; FileInfo[Rt].Flags; Rt++)
    {
		if(Rt >= MAX_OPEN_FILES)
            return Not_Open_FILE;
    }
    
    fp = FileInfo + Rt;					// 指向获得的空闲登记项
    
    /* 获取目录开始簇号和文件名 */
    fp->DirClus = _GetFDTInfo(fp->Name, DirFileName);	// 获取该文件的FDT项的首簇号,及文件名
    if (fp->DirClus < BAD_CLUS)
    {
        /* 文件已经以读写方式打开,不能再次以读写方式打开 */
        if (FindOpenFile(fp->DirClus, fp->Name,
					FILE_FLAGS_WRITE) == Not_Open_FILE)
        {
            if(FS_GetDateTime(&CurTime) != RETURN_OK) // 获取当前系统时间
            {
            	return GET_TIME_ERR;
            }
            
            if (FindFDTInfo(&temp, fp->DirClus, fp->Name) == RETURN_OK)
            {
                if ((temp.Attr & ATTR_DIRECTORY) != 0)
                {
                   return Not_Open_FILE;		// 如果该文件为目录,则不能删除
                }
                
                CrtTime.date = temp.CrtDate;    // 保存文件建立时间
                CrtTime.time = temp.CrtTime;
                CrtTime.msec = temp.CrtTimeTenth;
                
                if (RemoveFile(DirFileName) != RETURN_OK)   /* 删除文件 */
                {
                   return Not_Open_FILE;
                }
            }
            else
            {
                CrtTime = CurTime;              // 设置文件建立时间为当前时间
            }                
            
            /* 创建文件 */
            for (i = 0; i < 11; i++)			// 创建将要生成文件的FDT项
            {
                temp.Name[i] = fp->Name[i];		// 复制名字
            }
            temp.Attr = 0;						// 特性为0
            temp.FileSize = 0;

            temp.NTRes = 0;
            
            /*-------在此加入创建时间的程序---------*/
            temp.CrtTimeTenth = CrtTime.msec;	
            temp.CrtTime = CrtTime.time;
            temp.CrtDate = CrtTime.date;
            
            temp.LstAccDate = CurTime.date;
            temp.WrtTime = CurTime.time + 1;
            temp.WrtDate = CurTime.date;
			/*--------------------------------------*/
			
            temp.FstClusLO = 0;
            temp.FstClusHI = 0;
            if (AddFDT(fp->DirClus, &temp) == RETURN_OK)       /* 增加文件 */
            {
                /* 设置文件信息 */
                fp->Flags = FILE_FLAGS_WRITE;
                fp->FileSize = 0;
                fp->FstClus = 0;
                fp->Clus = 0;
                fp->Offset = 0;
                return Rt;
            } // if(Add..)
        } // if(Find..)
    } // if(fp..)
    return Not_Open_FILE;
}