I was impressed by this code by jsalai for Android (intended for .bas files)
'
' SmallBASIC,0.12.8 Android Sat, 22 Oct 2016 [jsalai49]
' >> FileManager.bas <<
' adapted (ie. stolen & exended) from [main.bas] by me.
' Optimized for 600*636 w-s-kb (600*1024 wo-kb) tablet.
' Works fine for me on Android and Win
'
' Warning: Not heavily tested. If you like it, use it &
' adapt it to meet your needs. No waranties, anyway!
'
' Tip-1: if you have selected a file, AND a directory
' is in the edit field, the file-operations affect
' the "directory/file" relative pathname construct.
'
' Tip-2: I made /storage/sdcard0/external_sdcard/sb12/
' directory as my "home directory" on Android.
' If set, it is NOT allowed to "walk" outside "home".
' If you set a "home directory", put this program
' there, and edit next line accordingly.
const _hd="/sb12/" '.../sb12/.../.../; _hd="//" no_home
const _rp=1 '0-full path 1-rel path if _hd above set
const _ch=txth("Q")
const _ls=2+_ch
const _mg=-txtw(" ")
const deleteId = "_/del"
const newId = "_/new"
const saveasId = "_/sav"
const renameId = "_/ren"
const viewId = "_/vie"
const rmdirId = "_/rmd"
const mkdirId = "_/mkd"
const chdirId = "_/chd"
const goupId = "_/upd"
const closeId = "_/ext"
func mk_men(v,l,x)
local b
b.x=x
b.y=ypos*_ch
b.value=v
b.label=l
b.color=15
b.nofocus=1
b.backgroundColor=0
b.type="link"
mk_men=b
end
sub gt_fil(p,@b,@d)
local c,e
c=files(p)
for e in c
if isdir(e)
d << e+"/"
elif right(e,4)=".bas"
b << e
fi
next
sort b use fn_cmp(lower(x),lower(y))
sort d use fn_cmp(lower(x),lower(y))
end
func fn_cmp(x,y)
fn_cmp=if(x=y,0,if(x>y,1,-1))
end
sub mk_ui
local b,z
p=cwd
cls
f.inputs << mk_men(deleteId,"[Del",0)
f.inputs << mk_men(newId,"New",_mg)
f.inputs << mk_men(saveasId,"SvAs",_mg)
f.inputs << mk_men(renameId,"Ren",_mg)
f.inputs << mk_men(viewId,"View]",_mg)
f.inputs << mk_men(rmdirId,"[RmDir",_mg*2)
f.inputs << mk_men(mkdirId,"MkDir",_mg)
f.inputs << mk_men(chdirId,"ChDir",_mg)
f.inputs << mk_men(goupId,"UpDir]",_mg)
f.inputs << mk_men(closeId,"[Exit]",_mg*2)
i_l=len(f.inputs)
b.color=14
b.resizable=1
b.type="label"
b.x=0
b.y=_ls
f.inputs << b
i_e=len(f.inputs)
b.backgroundcolor=1
b.color=15
b.x=0.1*xmax
b.y=2*_ls
b.width=0.8*xmax
b.type="text"
f.inputs << b
i_f=len(f.inputs)
b.backgroundcolor=0
b.type="list"
b.nofocus=1
b.y=3*_ls
b.height=ymax-b.y
b.x=10
b.color=11
b.width=xmax\2
f.inputs << b
i_d=len(f.inputs)
b.color=13
b.width=xmax*0.4
b.x=xmax*0.55
f.inputs << b
f.focus=i_e
f=form(f)
end
sub rl_lst(i)
local b_lst,d_lst,l,q,j
f.refresh(1)
dim b_lst,d_lst
gt_fil(p,b_lst,d_lst)
l=len(b_lst)
f.inputs(i_f).value=b_lst
' if !l
s=""
i=-1
' else
' if i>=l
' i=l-1
' fi
' s=b_lst(i)
' fi
f.inputs(i_d).value=d_lst
f.inputs(i_d).selectedIndex=-1
f.inputs(i_f).selectedIndex=-1 'i
f.inputs(i_e).value="" 's
if _rp
q=right(p,len(p)-instr(p,_hd))
f.inputs(i_l).label=q
else
f.inputs(i_l).label=p
fi
f.refresh(0)
f.close()
f=form(f)
end
sub rm_Dir
local n,b
n=f.inputs(i_e).value
if !(exist(n) && isdir(n))
exit sub
fi
b=files(n)
if len(b)
w.alert(n+" - Dir not empy!")
exit sub
fi
w.ask("Remove Dir ["+n+"] ?")
if w.answer=0
rmdir n
rl_lst(0)
fi
end
sub mk_Dir
local n
n=f.inputs(i_e).value
if n=""
exit sub
fi
if lower(right(n,4))=".bas"
n=leftoflast(n,".bas")+"/"
fi
if exist(n)
w.alert(n+" - Dir exist")
exit sub
fi
w.ask("Create Dir ["+n+"] ?")
if w.answer=0
mkdir n
rl_lst(0)
fi
end
sub ch_Dir
n=f.inputs(i_e).value
if isdir(n) and left(n)!="."
chdir n
p=cwd
rl_lst(0)
fi
end
sub up_Dir
p=cwd
if instr(p,_hd)!=len(p)-len(_hd)+1
chdir ".."
p=cwd
rl_lst(0)
fi
end
sub deleteFile
n=f.inputs(i_e).value
if n=""
exit sub
fi
if exist(n) && isdir(n)
if right(n)!="/"
n+="/"
fi
n=n+s
fi
if !exist(n)
w.alert(n+" - File not exist")
exit sub
fi
w.ask("Delete file: ["+n+"] ?")
if w.answer=0
kill n
rl_lst(0)
fi
end
sub newFile(x)
local i,t,n,b
n=f.inputs(i_e).value
i=f.inputs(i_f).selectedIndex
if n="" or s=n or (x && !exist(s))
exit sub
fi
if exist(n) && isdir(n)
if right(n)!="/"
n+="/"
fi
n=n+s
fi
if lower(right(n,4))!=".bas"
n+=".bas"
fi
if exist(n)
w.alert(n+" - File exist")
exit sub
fi
if x=1
w.ask("Save: ["+s+"] as: ["+n+"] ?")
if w.answer=0
tload s,t
tsave n,t
rl_lst(i)
fi
elif x=2
w.ask("Rename/Move: ["+s+"] to: ["+n+"] ?")
if w.answer=0
rename s,n
rl_lst(i)
fi
else
w.ask("Create empty file: ["+n+"] ?")
if w.answer=0
dim t
t << "","'SmallBASIC,"+sbver+", [jsalai49]"
tsave n,t
rl_lst(i)
fi
fi
end
sub viewFile
local d,i,j,g,b
n=f.inputs(i_e).value
if n=""
exit sub
fi
if exist(n) && isdir(n)
if right(n)!="/"
n+="/"
fi
n=n+s
fi
if n="" or !exist(n)
w.alert(n+" - File not exist")
exit sub
fi
i=f.inputs(i_f).selectedIndex
tload n,d
w.graphicsScreen2()
cls
color 11,0
for j in d
?j
next
if j!=""
?
fi
b.label="[Close "+n+"]"
b.color=14
b.y=-1
b.x=(xmax-txtw(b.label))\2
b.type="link"
b.backgroundColor=0
g.inputs << b
g=form(g):?
g.doEvents()
w.graphicsScreen1()
rl_lst(i)
end
sub upd_ed
if len(f.value)>0
f.inputs(i_e).value=f.value
f.refresh(0)
if isfile(f.value)
s=f.value
elif isdir(f.value)
z=f.value
fi
fi
end
w=window()
w.showKeypad()
mk_ui
rl_lst(0)
while 1
f.doEvents()
select case f.value
case deleteId
deleteFile
case newId
newFile(0)
case saveasId
newFile(1)
case renameId
newFile(2)
case viewId
viewFile
case rmdirId
rm_Dir
case mkdirId
mk_Dir
case chdirId
ch_Dir
case goupId
up_Dir
case closeId
cls
exit loop
case else
upd_ed
end select
f.value=""
wend