📄 efsl_cmds.c
字号:
{
_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 + -