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

📄 efsl_cmds.c

📁 efsl-0.2.8(sd card 文件系统 fat)
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		_error_Efsl("please input command as:mkdir filename");
		_error_Efsl("\n\n");
		return 1;
	}
    CreateTargetVal_Efsl(argv[0]);

    if(0 == mkdir(&efs.myFs,(eint8*)TargetVal_Efsl))
	{
		_log_Efsl("make directory ");
		_log_Efsl(argv[0]);
		_log_Efsl(" successful\n\n");
		return 0;
		
	}
	else
	{
		_error_Efsl("mkdir failure! please check disk full or unformated\n");
		return 1;
	}
	
}


void _show_free_Efsl() 
{
    euint32  cluster;
        
    if(efs.myFs.type==FAT12)
    {
		//modify by kaihua.yang at 2011-8-18
        //cluster = fat_countFreeClusters(&efs.myFs);
		cluster = fat_printFreeClusters(&efs.myFs);
        _log_Efsl("FAT12: %lu clusters\n",cluster);
    }
    else if(efs.myFs.type==FAT16)
    {
        //modify by kaihua.yang at 2011-8-18
        //cluster = fat_countFreeClusters(&efs.myFs);
		cluster = fat_printFreeClusters(&efs.myFs);
        _log_Efsl("FAT16: %lu clusters\n",cluster);
    }
    else if(efs.myFs.type==FAT32)
    {
        if(! fs_getFsInfo(&efs.myFs,1))
        {
            cluster = efs.myFs.FreeClusterCount;
            _log_Efsl("FAT32: %lu clusters\n",cluster);
        }
        else
        {
            _log_Efsl("FAT32: fs_getFsInfo(&efs.myFs,1) fail.\n",cluster);
        }
    }

	//never using
	cluster++;
}

/************************************************************
*
*  			查看盘的使用情况
*
************************************************************/
long freeFunc_Efsl(int argc,char **argv)
{
	_show_free_Efsl();
	_log_Efsl("\n");
	return 0;
}


/****************************************************************************/
void user_mkdir(eint8*dirname)
{
    if(0 == mkdir(&efs.myFs,(eint8*)dirname))
		_log_Efsl("make directory  :%s  :successful\n",dirname);
	else 
		_log_Efsl("make directory  :%s  :fail\n");	
}
extern void _write_file_Efsl(const char *name, const char *txt);
void user_write(const char *name, const char *txt)
{
	_write_file_Efsl(name,txt);
   		_log_Efsl("write to file   :%s  :successful\n",name);
}
/*文件拷贝*/
int cpfile(DirList*dlist,FileSystem*fs,eint8* fromdirname,eint8*todirname,eint8 mode);
long cpfileFunc_Efsl(int argc,char **argv)
{
	//arg[0]:source  arg[1]:target arg[2]:mode /
	/*判断源文件是否从根开始,如果不是,把当前目录接上*/
	   
	/*拷贝文件*/
	cpfile( &Efsl_DirLst, &(efs.myFs) ,(eint8*)argv[0],(eint8*)argv[1],*(char*)argv[2]);
	return 0;
}

/*目录拷贝*/
int cpdir(DirList*dlist,FileSystem*fs,eint8* currentfromdirname,eint8*currenttodirname,eint8 mode);
long cpdirFunc_Efsl(int argc,char**argv)
{

   cpdir(&Efsl_DirLst,&(efs.myFs) ,(eint8*)argv[0],(eint8*)argv[1],*(char*)argv[2]);

   return 0;
}

/*****************************************************************************/
/*add by kaihua.yang 2011-8-18
	1.if dir doesn't exit,creat
	2.options:
				-f:force ,if file exist,cover it
				-a:appedn,if file exist,append it

	/dir1/filename /dir2				 
*******************************************************************************/int cpfile(DirList*dlist,FileSystem*fs,eint8* currentfromdirname,eint8*currenttodirname,eint8 mode)
{
	FileLocation tloc,sloc;	euint32 nc,parentdir,fileptr=0;
	eint8*next=0;
	euint8*tmp=0;	eint8 ffname[12];
	eint8 fromdirname[100];
	eint8 todirname[100];
	uint8 tmpdir[100];
	euint8 forcopy[512];
	eint8 type=0,it=0,i=0,len=0;
	File filesrc,filetar;
	
	/*目录不是从根开始的,加入当前目录*/
	memSet((void*)fromdirname,100,0);
	memSet((void*)todirname,100,0);
   if((*currentfromdirname)!='/'){
   		len = strlen(CurDirGet());
   		strncpy((char*)fromdirname,(char*)CurDirGet(), len);
		if(fromdirname[len-1]!='/'){
		fromdirname[len] = '/';
		len++;
		}
		strncpy((char*)&fromdirname[len],(char*)currentfromdirname, (strlen(currentfromdirname)));
	}else{strncpy((char*)&fromdirname[0],(char*)currentfromdirname, (strlen(currentfromdirname)));}
				
	if((*currenttodirname)!='/'){
   		len = strlen(CurDirGet());
   		strncpy((char*)todirname,(char*)CurDirGet(), len);
		if(todirname[len-1]!='/'){
		todirname[len] = '/';
		len++;
		}
		strncpy((char*)&todirname[len],(char*)currenttodirname, (strlen(currenttodirname)));
	}else{strncpy((char*)&todirname[0],(char*)currenttodirname, (strlen(currenttodirname)));}

	/*判断源文件是否存在,目标目录是否存在*/
	if(fs_findFile(fs,fromdirname,&sloc,&parentdir)!=1)return (-1);
	type = fs_findFileIt(fs,todirname,&tloc,&parentdir,&it);
	//if(type == 1)return (-4);
	memSet((void*)tmpdir,100,0);
 	memSet((void*)ffname,12,0);

	/* ----路径不存在,创建路径 ---*/
	/*目录从根目录开始*//*  /dir3/filename   /dir1/dir2 */
		len=0;
		next = todirname+1;
		tmpdir[len] = '/';
		len++;		
		if(type!=2){	
			/*取得最后一个目录的名字*/
			while(i<it){/*find first name need to mkdir*/					
			   /*get next name*/
				memSet((void*)ffname,12,0);
				next=file_normalToName(next,ffname);
			    /*name exist ,then mkdir*/
				if(*ffname!='\0'){		
					/*current dir */
					if(tmpdir[len-1]!='/'){
						tmpdir[len] = '/';
						len++;
					}
					strncpy((char*)&tmpdir[len],(char*)ffname, (strlen(ffname)));
					len+=(strlen(ffname));
				}
				i++;
			}
			/*对不存在的目录创建*/
		   while(next!=0){/*mkdir all direct*/				
			   /*get next name*/
				memSet((void*)ffname,12,0);
				next=file_normalToName(next,ffname);
			    /*name exist ,then mkdir*/
				if(*ffname!='\0'){		
					/*current dir */
					if(tmpdir[len-1]!='/'){
						tmpdir[len] = '/';
						len++;
					}
					strncpy((char*)&tmpdir[len],(char*)ffname, (strlen(ffname)));
					len+=(strlen(ffname));

					if(mkdir(fs,(eint8*)tmpdir)!=0){
						_log_Efsl("make dir failure         :%s\n",tmpdir);
						return -1;
					}
						//_log_Efsl("make dir sucessfully     :%s\n",tmpdir);
				}else{break;} /*cann't open the dir,break;*/			
				it++;
			}  		}else{ /*目录已经存在,直接拷贝路径*/		
			/*current dir */
			if(tmpdir[len-1]!='/'){
				tmpdir[len] = '/';
				len++;
			}
			strncpy((char*)&tmpdir[len],(char*)(todirname+1), (strlen(todirname+1)+1));
			len+=(strlen(todirname+1));
		}
		/*取文件名*/
		nc = strlen(fromdirname);
		while(nc>0){nc--;if(fromdirname[nc] == '/')break;}
		if(tmpdir[len-1]!='/'){
			tmpdir[len] = '/';
			len++;
		}
		strncpy((char*)&tmpdir[len],(char*)&(fromdirname[nc+1]), (strlen(&(fromdirname[nc+1]))));

	/*--- 根据选项,复制文件 ---*/
	switch(mode)
	{
		/*-----目标文件不存在,创建,目标文件存在,覆盖-----*/
		case 'f':
					if(0 != file_fopen(&filetar,fs,(eint8*)tmpdir,'w')){
						/* 清空文件 */
						if(clearfile(fs,tmpdir)!=0){
						 _log_Efsl("can't clear target file   :%s\n",tmpdir); 
						return (-1);
					  }	
					  /*以append 方式打开*/				
						if(0 != file_fopen(&filetar,fs,(eint8*)tmpdir,'a')){
								_log_Efsl("open target file failure        :%s\n",tmpdir);
								return -1; 
							}					
					}
					else{
						_log_Efsl("open target file failure        :%s\n",tmpdir);
						return -1;
					}
					fileptr = 0;
					break;
		/*---目标文件存在-追加--,目标文件不存在,创建 ----*/
	    case 'a':	
					if(0 != file_fopen(&filetar,fs,(eint8*)tmpdir,'w'))
						if(0 != file_fopen(&filetar,fs,(eint8*)tmpdir,'a')){
								_log_Efsl("open target file failure        :%s\n",tmpdir);
								return -1; 
							}/*不清空内容*/
					fileptr = filetar.FilePtr;
		            break;
		/*---默认,不覆盖 ---*/
		default:
					if(0 != file_fopen(&filetar,fs,(eint8*)tmpdir,'w')){
						_log_Efsl("target file exists          :%s\n",tmpdir);
						return -1;
					} 
					break;
	}

	/*在iomap 中找一块空的内存来用*/
	{	
		/*esint32 ret=0;
		ioman_flushAll(fs->part->disc->ioman);//flush all ,释放所有内存
		if((ret=(euint32)ioman_findFreeSpot(fs->part->disc->ioman))==-1){				_log_Efsl("IOmap has no free spot,please  flup some iomap.\n");
				return (-6);
			}
		nc = (euint32)ret;		tmp=ioman_getPtr(fs->part->disc->ioman,(euint16)nc);
		*/
		tmp = forcopy;			
	}
	/*打开原文件,如果原文件大小为0,不用复制数据*/
	if( 0 != file_fopen(&filesrc,fs,(eint8*)fromdirname,'r'))
			_log_Efsl("open file failure         :%s\n",fromdirname);
	if(filesrc.FileSize==0){
		file_fclose(&filesrc);
		file_fclose(&filetar);
			_log_Efsl("copy file sucessfully     :%s\n",tmpdir);
			_log_Efsl("copy file sucessfully .Has copy %lu bytes .\n",0);
		return 0;		
	}

	/*从filesrd 中读入数据写入filetar中*/
	{
		int hasread=0,haswrite=0;
		nc=0;
		while(nc<filesrc.FileSize){
			if(filesrc.FileSize>nc+512)
				hasread = file_fread(&filesrc,nc,512,tmp);
			else hasread =file_fread(&filesrc,nc,filesrc.FileSize-nc,tmp);

			haswrite = 0;
			it=0;
			while(haswrite < hasread){
				haswrite +=file_fwrite(&filetar,(nc+fileptr),hasread,tmp);
				nc += haswrite;
				/*次数太多,出错*/
				it++;
				if(it>100){
						file_fclose(&filesrc);//关闭文件
						file_fclose(&filetar);
						ioman_releaseSector(fs->part->disc->ioman,tmp);//释放内存
						_log_Efsl("Have try 100 time to copy %lu bytes .\n",hasread);
						_log_Efsl("Has copy %lu bytes .\n",nc);	
					return (-6);		
				}					
			}		
		}
		/*文件成功复制,释放文件与内存,返回*/
		file_fclose(&filesrc);//关闭文件
		file_fclose(&filetar);
		//ioman_releaseSector(fs->part->disc->ioman,tmp);//释放内存
		_log_Efsl("copy file sucessfully .Has copy %lu bytes .\n",nc);	
	}	

	return 0;
}


/*****************************************************************************/
/*add by kaihua.yang 2011-8-18
	1.if dir doesn't exit,creat
	2.options:
				-f:force ,if file exist,cover it
				-a:appedn,if file exist,append it
	/dir1  /dir2
	dir1下面都是文件			 
*******************************************************************************/
int cpdir(DirList*dlist,FileSystem*fs,eint8* currentfromdirname,eint8*currenttodirname,eint8 mode)
{
	FileLocation loc;	euint32 parentdir;
	eint8 tmpdir[100];
	eint8 fromdirname[100];
	eint8 todirname[100];
	DirList calldlist;
	int len=0,calllen=0;

		
	/*目录不是从根开始的,加入当前目录*/
	memSet((void*)fromdirname,100,0);
	memSet((void*)todirname,100,0);
   if((*currentfromdirname)!='/'){
   		len = strlen(CurDirGet());
   		strncpy((char*)fromdirname,(char*)CurDirGet(), len);
		if(fromdirname[len-1]!='/'){
		fromdirname[len] = '/';
		len++;
		}
		strncpy((char*)&fromdirname[len],(char*)currentfromdirname, (strlen(currentfromdirname)));
	}else{strncpy((char*)&fromdirname[0],(char*)currentfromdirname, (strlen(currentfromdirname)));}
				
	if((*currenttodirname)!='/'){
   		len = strlen(CurDirGet());
   		strncpy((char*)todirname,(char*)CurDirGet(), len);
		if(todirname[len-1]!='/'){
		todirname[len] = '/';
		len++;
		}
		strncpy((char*)&todirname[len],(char*)currenttodirname, (strlen(currenttodirname)));
	}else{strncpy((char*)&todirname[0],(char*)currenttodirname, (strlen(currenttodirname)));}

   	/*判断目标目录是否合法*/
	if(fs_findFile(fs,todirname,&loc,&parentdir)==1){
		_log_Efsl("target is a file        :%s\n",todirname);
		return (-1);
	}

	/*判断源目录是否存在*/
	if(fs_findFile(fs,fromdirname,&loc,&parentdir)==1){
		_log_Efsl("source is a file        :%s\n",fromdirname);
		return (-1);
	}else if(fs_findFile(fs,fromdirname,&loc,&parentdir)!=2){
		_log_Efsl("source doesn't exist    :%s\n",fromdirname);
		return (-1);
	}

	/*拷贝目标目录*/ 	
	memSet((void*)tmpdir,100,0);
	len = strlen(fromdirname);
	strncpy((char*)&tmpdir,(char*)(fromdirname), (len+1));
	if(tmpdir[len-1]!='/'){
		tmpdir[len] = '/';
		len++;
	}
	/*找出目录下所有文件*/
    if (ls_openDir(dlist,fs,(eint8*)fromdirname) == 0) 
    {
		while ( ls_getNext(dlist) == 0 )
		{
			/*拷贝文件名*/
			int i=0;
			uint8 ffname[11]={0,0,0,0,0,0,0,0,0,0,0};
			while(dlist->currentEntry.FileName[i]!=' '&&dlist->currentEntry.FileName[i]!='\0'&&i<11){
				ffname[i]=dlist->currentEntry.FileName[i];i++;
			}
			/*组合目录==dir + name*/
			strncpy((char*)&tmpdir[len],(char*)(ffname),11);

			/*判断文件是常规文件还是目录,如果是目录再回调一次本函数*/
			if(dlist->currentEntry.Attribute & EFSL_F_DIR){
					/*添加目录名*/
					calllen = strlen(todirname);
					if(todirname[calllen-1]!='/'){
						todirname[calllen] = '/';
						calllen++;
					}
					strncpy((char*)&todirname[calllen],(char*)(ffname),11);
					/*再一次目录到目录的复制*/
					_log_Efsl("copy dir   :%s  ---->%s  \n",tmpdir,todirname,ffname);
					if(0 > cpdir(&calldlist,fs,tmpdir,todirname,mode))
						_log_Efsl("copy dir  failure        :%s\n",tmpdir);	
					/*删除目录名*/
					memSet((void*)&todirname[calllen],11,0);
													
			}else{
			   	/*拷贝文件到目录下,方式由mode 定*/	
				_log_Efsl("copy file  :%s  ---->%s/%s  \n",tmpdir,todirname,ffname);
				if(cpfile(dlist,fs,tmpdir,todirname,mode)!=0){
				 	_log_Efsl("copy file failure        :%s\n",tmpdir);
					return (-1);
				}			
			}

			
			/*删除文件名*/
			memSet((void*)&tmpdir[len],11,0);
		} 
	}
	
	return 0;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -