请选择 进入手机版 | 继续访问电脑版

登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 580|回复: 1

[lua教程] 【lua教程】简单的文件管理器

[复制链接]

441

主题

506

帖子

1944

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1944

荣誉管理论坛元老

发表于 2021-7-1 08:40:19 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. require "import"% h7 O% t4 d& R) N( E0 S
  2. --import "android.app.*"
    / l- d' k/ F6 p5 R/ _
  3. --import "android.os.*"
    - n; x" W$ r5 G6 S: ^
  4. import "android.widget.*"4 Y9 D# E( b8 k  u! h0 v8 R
  5. import "android.view.*"
    ! Y; ?. N: |# r$ R- V% X, O
  6. 5 [( h: ?+ `4 g& l  F& C0 r0 b
  7. import "java.io.File" --文件系统0 q( Y0 z+ O, F; g
  8. import "android.app.AlertDialog" --对话框1 E8 @0 C: ?3 N: |9 r' o
  9. import "android.webkit.MimeTypeMap"
    / j# a. R8 g( Z( W: O5 ?
  10. import "android.content.Intent"  K( N' E; ^0 @; c
  11. import "android.net.Uri" --系统打开文件
    3 M! V2 s- K3 \6 y% C; E
  12. import "com.androlua.LuaUtil" --辅助库 删除文件夹
    5 W% m8 I, [1 b2 @' r7 V
  13. import "android.text.format.Formatter" --格式化文件大小. W: D1 |) l( u: z7 H+ s. N; d
  14. ' R+ Y$ x# O1 o0 q# f% r
  15. layout={
    1 H7 D; K0 {/ ]3 Y% ?, ~& K2 M: ~
  16.   LinearLayout;
    : _4 R; _; `7 P& ~8 h( |
  17.   orientation="vertical";9 a  n! R+ R9 B: K- |
  18.   layout_width="fill";
    5 m$ G  x8 n4 x$ c* v  \1 I2 P+ H
  19.   layout_height="fill";
    * V7 I& Y' B& P3 x1 n7 q
  20.   {
    3 M2 F9 v6 h: E1 o. i" C
  21.     TextView;
    3 L! o% o8 u! ]6 v9 N6 d
  22.     id="path_TextView";
    9 E8 }# o5 k% T# v) z7 l
  23.     text="path: /sdcard";- w# I" S4 C! s7 n, N: s8 K2 m
  24.   };3 N- w1 \2 Z* q* E; t; I: |, J
  25.   {
    8 _9 t7 S! N; S1 J( I( X
  26.     LinearLayout;
    ' H$ ?5 Z3 [; S+ W* C6 A
  27.     {
      [# m' \+ R/ {# G8 n% S! L
  28.       Button;
    . \; O1 Q0 \$ i  `: o$ ~
  29.       id="addFile_Button";4 d  Z( V5 J8 P- y0 j8 u
  30.       text="+文件";6 b( V7 ]& `3 x, T6 P  q
  31.     };2 ^2 R8 h/ G. c# ?4 z: T4 l5 o
  32.     {& F9 q% I; D# C* s8 B; y9 D
  33.       Button;# Z" T! |' g* i
  34.       id="addDir_Button";0 `0 N$ m! ^# h; s' a( j
  35.       text="+文件夹";
      T  @8 L+ `3 p* O0 J' z. }
  36.     };
    7 S+ V5 d7 F4 z+ X; q
  37.   };1 z6 \8 X# N, @
  38.   {2 `# B% Q, J2 L/ P& S
  39.     AbsoluteLayout;
    0 Z/ Y* i+ h5 m* a+ w& G+ i- o3 ^# K
  40.     layout_height="-1";
    ) J, O$ g% h, i# S* V& F! x  K
  41.     layout_width="-1";
    0 j7 s: o1 @: v8 D9 h4 {3 t$ y
  42.     {
    9 b, O9 b9 q8 L& F) o
  43.       LinearLayout;
    $ v* t: o1 J& n" b8 X) k
  44.       id="fileEdit_LinearLayout";
    : ^& y1 D3 ]# I2 W. U* _
  45.       layout_height="-1";% D& y& B$ b; X% G0 L- h: W
  46.       layout_width="-1";
    1 m, i) t! `5 L. z5 g3 h( v( T
  47.       orientation="vertical";. b( V. I5 y- j
  48.       {2 U1 u" v" U& t9 ^# \& Q
  49.         LinearLayout;. }+ U- @. O% ]; w6 S. F/ n9 N, [
  50.         layout_width="-1";. [! d" U8 V1 Y9 x) k1 g& Q9 T
  51.         {
    / ^8 C/ p3 j3 W" x4 \, ^
  52.           Button;
    . W0 D+ v: W( G  S$ K
  53.           id="back_Button";* x- D  Y1 x* W! Q6 h. u- _8 q1 P
  54.           text="<返回";# ?5 U1 ?3 L: F- R% S
  55.         };
    * E) P- ~! I1 H: l: e, d5 l
  56.         {
    / @1 M. u# o# }- c0 E) M* h6 h
  57.           Button;
    . u( @/ ~0 L1 v* A! K8 q
  58.           id="save_Button";) T: ?+ y: A$ r  Y& X, t; `
  59.           text="保存";
    2 g" J; N/ G3 h& ]5 I  }( B" a
  60.         };
    6 C: ~+ Q, U- J, I" A
  61.       };
    0 y5 ~2 A; m* {& k! b
  62.       {
    - _+ b5 F2 |' ]3 u; R* \
  63.         EditText;
    5 ?0 X+ p" s# Q. ?
  64.         id="file_EditText";
    8 V* N4 [; m& d8 _
  65.         layout_height="-1";. y" `8 e& g9 I7 }9 x0 N/ }
  66.         layout_width="-1";% ^! q- q. E) d2 w
  67.         gravity="start";
    + K! u& b0 I# c# e1 g$ h1 T! R% i
  68.         backgroundColor="#fffae8";, r/ {- r6 s' j+ ~+ Y" w
  69.       };& _# Y0 d) N3 Q( q4 j5 {, o
  70.     };" j0 M3 J3 d% B$ g' {
  71.     {: h0 e! Q: Y: m2 |
  72.       ListView;. Q% N! k6 l- g* N  W2 G& M
  73.       id="dir_ListView";1 O2 b% S$ q0 E' p4 J% B0 e) }
  74.       layout_height="-1";
    $ j6 M6 L9 H1 {1 Y
  75.       layout_width="-1";5 V& {' _2 \8 j6 @7 f, V
  76.     };
    0 M# A3 D4 [* H* R* \" l+ L# Z4 a
  77.   };: k+ m6 O; ]: w" Z
  78. };
    3 Z2 W8 L1 @& u3 D
  79. activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题
    ! Z. v; x7 Y$ m
  80. activity.setTitle("文件管理")
    ) f8 u$ ]2 u/ z% x
  81. activity.setContentView(loadlayout(layout))* i* K* X; [( w- K4 G- K

  82. ; C5 d, G9 l; E
  83. % s4 n8 K3 Q4 _8 s1 j! D
  84. local path = "/sdcard"8 D" ^. J) ?1 V" N0 o; }2 q
  85. local adp = ArrayAdapter(activity, android.R.layout.simple_list_item_1)+ ]) p6 j+ g  Z5 b
  86. dir_ListView.setAdapter(adp)
    9 z; T  E0 Q7 [$ a  Q
  87.   A' M) V* v9 O
  88. function update()/ ^+ H% _( V; E+ p
  89.   path_TextView.text = "path: "..path6 C3 j3 D6 Z& v6 `& |1 a
  90.   if File(path).isDirectory() then --打开文件夹
    % J9 J# _* Z7 v) ^( J8 G
  91.     dir_ListView.setVisibility(View.VISIBLE)
      Q: e  M# s! {
  92.     fileEdit_LinearLayout.setVisibility(View.GONE)5 i( I% z3 t$ E

  93. + e- Q" h7 b: I& O5 F4 o
  94.     adp.clear() --清空1 Q* X" Z; M7 G# m9 f
  95.     adp.add("../") --父文件夹
    * X1 R* L& `6 y
  96.     local ls = File(path).listFiles()
    + t) y, ^4 `5 o- ^( ~
  97.     if ls then --不为空
    - }/ H! v" }6 r9 o# v. v0 f0 c% v
  98.       local fileList = luajava.astable( ls )
    , f  c2 i" R* K7 v* r" n
  99.       table.sort(fileList, function(a,b) --排序6 s* M% v+ |3 r2 R) Y
  100.         return (a.isDirectory()~=b.isDirectory() and a.isDirectory()) or ((a.isDirectory()==b.isDirectory()) and a.Name<b.Name)
    7 B, S% ~* ~9 {4 c. f
  101.       end)
    * `% f  r" j  N9 v8 B4 T+ R" m. _# F  }- B
  102.       for i,v in ipairs(fileList) do2 R% m( Z3 g8 ?) _4 @' g+ {& z
  103.         if v.isDirectory() then --文件夹
    6 {* Q" n- P, o2 s5 t1 x1 J: i
  104.           adp.add(v.Name.."/")
    * a+ @+ r. t( k/ s" z
  105.          else1 g( B8 s7 {8 E& p0 J# B: H  d
  106.           local cal = Calendar.getInstance()% \) Y: C2 F1 Y* `
  107.           local time = v.lastModified() --最后修改时间
    . I( T* t# c8 v/ T, f0 _5 l: i
  108.           cal.setTimeInMillis(time)+ W/ n3 `# o1 `! C
  109.           adp.add( v.Name.."\n\t\t\t"..Formatter.formatFileSize(activity, v.length()).."\t\t\t\t\t\t"..cal.getTime().toLocaleString() )
    + h) y% \  G2 k
  110.         end7 Z0 t7 r7 o& g/ l9 V0 E
  111.       end' V+ N( Y) {. c% e
  112.     end
    0 |5 y: D& Z: g/ c! T

  113. 3 `& K/ U$ `1 a1 S) o
  114.    else --查看文件8 C! d2 R- ^, f1 m5 D! ~4 t
  115.     dir_ListView.setVisibility(View.GONE)
    6 ]) E8 A+ c( l
  116.     fileEdit_LinearLayout.setVisibility(View.VISIBLE). Y- ?& y- W, F9 [; U
  117.     local file = io.open(path, "r")( ?( E+ _  Q  ?: S
  118.     file_EditText.text = file:read("*a")! q; l) Q% m0 ?* ]3 T
  119.     file:close(file)
    1 E% h0 V% ~7 S; h+ \' X
  120.   end
    3 {! P6 K" o/ G2 X3 O$ ~* b
  121. end4 r1 M2 d- }$ B7 E/ r
  122. update()
    - r( G) @/ a2 j* _7 [
  123. : W5 s% U; Q/ V7 t
  124. --系统打开文件
    . o* R, k+ x, e& T% _+ a& j
  125. function openFile(path)# j1 L; [1 L4 ], j- A2 Q7 w% k
  126.   local FileName = tostring(File(path).Name)
    / K8 f, M2 O( W) u/ |- U7 \
  127.   local ExtensionName = FileName:match("%.(.+)")2 y) B! g: \0 p0 q3 b
  128.   local Mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ExtensionName)
    ' v# S  g7 J# H( v$ }
  129.   if Mime then7 B( s' Z# j2 l9 k, S& a2 }: Q7 p
  130.     intent = Intent()6 i7 }# o* e  L
  131.     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)7 }: O: H+ f; R" R8 e9 R; {& Q$ \
  132.     intent.setAction(Intent.ACTION_VIEW);
    3 n, D9 J* u+ P- @
  133.     intent.setDataAndType(Uri.fromFile(File(path)), Mime);
    - t4 A8 Y" n, X5 e# S
  134.     activity.startActivity(intent)1 I+ V. d" Z, D
  135.     return true% ?1 F! v" v# z) J; P
  136.    else
    ( ~, _* ]$ s+ n9 b' I; q* _
  137.     return false
    2 d' D( S" Q% ]! Y' {
  138.   end
    * d  |  i, O! s/ N6 l. o+ A$ `
  139. end1 b/ b3 q* P) X7 Q: ^
  140. ' P: v( l! [* l" p& j3 G' ^* }/ {3 ]
  141. --列表点击事件0 b0 i- A3 Y/ m# X- P4 A
  142. dir_ListView.onItemClick=function(l,v,p,s)
    3 O& O" n8 J0 v
  143.   local name = v.Text  _; W) z  l+ e; f0 U  O6 V; @9 Q
  144.   if string.sub(name, -1) == "/" then
    7 i/ w2 \' {9 r8 ?- \
  145.     name = string.sub(name, 1, -2)
    ( X8 L# T! L' c5 s
  146.    else
    : p& l* y  [- X3 l- h! G4 G' w
  147.     name = string.match(name, "(.-)\n")3 x% `! C4 v% q: b" v. H
  148.   end
    . G& c) U: K# Y% v0 [: m
  149.   if name == ".." then$ q. P. k( X5 u/ i5 K% f8 ^: k
  150.     path = string.match(path, "(.*)/.+$")$ n+ x4 P- Q& E+ D- q& p' g
  151.    else
    $ o  }# g" F  V4 F/ x" \
  152.     path = path.."/"..name* z$ V$ W% x0 d/ x
  153.   end) s, d, O( G: T1 v
  154.   update()* b& S; `# I2 @( {  o% Q
  155. end
    * [1 ?& o9 l  }0 x% p9 b5 T' b7 @
  156. . u# {# N3 Q0 f9 ?: Y
  157. local pop = PopupMenu(activity, path_TextView) --弹出菜单' Z" V$ M) @: ^2 d: t# ^
  158. local menu = pop.Menu
    " [: q% K/ d  N7 Z. \
  159. --系统打开
    4 n9 F5 h. F3 l. d" K
  160. menu.add("打开(系统)").onMenuItemClick=function(v)$ U1 Q! Q8 f; T4 `: `% P
  161.   openFile(path)# Y; U: W- u/ Y0 c$ x# v( h! M
  162.   path = string.match(path, "(.*)/.+$")
    ; e' U8 Z% @. }% L# I8 }6 l% D# L9 ]3 K
  163. end
    6 y6 I/ p4 x- Y+ l1 F( o
  164. --删除文件/文件夹+ W% K1 ^/ R1 l/ I
  165. menu.add("删除").onMenuItemClick=function(v)
    # N, ~) o1 z0 q  m0 z) s
  166.   AlertDialog.Builder(this)$ B& C' u' V' k: K3 B
  167.   .setTitle("真的要删除"..path.."吗?")5 a3 E6 R* |% o0 X: L$ J
  168.   .setMessage("(将无法恢复)")
    3 J) P# Q% X; M; ^' v2 t' A
  169.   .setPositiveButton("删除",function: \1 @+ J4 b" @- [
  170.     LuaUtil.rmDir( File(path) )
    % C( u& }" t4 y( {% V4 a
  171.     path = string.match(path, "(.*)/.+$")
    4 X6 Z7 o& N8 V  W' L! V- b9 j' |4 y
  172.     update()) }) @0 b7 f! C# N. s6 N! X* {3 W+ ?
  173.     Toast.makeText(activity, "删除成功",Toast.LENGTH_SHORT).show()
      z, `2 s" C/ C% {, s
  174.   end)
    " _" W/ X1 ], _
  175.   .setNeutralButton("取消",nil)5 \2 ^0 P+ C+ v. S- z: B) c
  176.   .show()5 K* B: s" d6 R$ f
  177. end8 y, m6 _- J+ t2 ]
  178. --重命名/移动文件
    ; m) I0 U' K+ |7 t) T+ c
  179. menu.add("重命名/移动").onMenuItemClick=function(v), z9 P4 b( o- I: J8 r+ B
  180.   local editText = EditText(activity)
    : V: E/ f- Y  U7 R4 O

  181. - Y2 F# m% d) N7 e" _. N
  182.   AlertDialog.Builder(this)
    5 z3 z+ e$ A* b# Y' E+ a
  183.   .setTitle("请输入")
    : Y( {( V# P9 z4 t4 |! g
  184.   .setIcon(android.R.drawable.ic_dialog_info)2 i0 _2 j4 }" Z
  185.   .setView(editText)) {5 H: Z9 A' N' b# c! l6 W
  186.   .setPositiveButton("确定", function# h2 K& y# l2 J
  187.     File(path).renameTo(
    3 e: @4 Y' D' `  h8 a
  188.     File( string.match(path, "(.*)/.+$").."/"..editText.text )
    8 C, l+ m+ ]: D- V2 E5 H
  189.     )
    2 ^. d( C9 T. u/ I, M
  190.     Toast.makeText(activity, "移动成功",Toast.LENGTH_SHORT).show()# h' a1 T1 `1 S+ B
  191.     path = string.match(path, "(.*)/.+$")+ j  j3 ~) E* B% S* m( x% @/ t
  192.     update()  Q/ P! n+ \1 \3 u7 r2 I1 Q
  193.   end)
    ; ^- p2 D+ m9 {' R. q& [2 W9 U9 S
  194.   .setNegativeButton("取消", nil)
    & P2 |9 U& U7 O' i, E' H6 m
  195.   .show();0 K9 n0 J% t9 d# I8 z3 T- N7 N9 I
  196. end
    - X& c! j5 S! G* H( {

  197. . g) J( P6 |# j. _$ {
  198. --列表项目长按
    . @0 s# J; Y/ _# O! ]
  199. dir_ListView.onItemLongClick = function(l,v,p,s)$ I' M9 J, `9 ~1 \  A+ O1 M
  200.   local name = v.text
    ) E! N7 f- [0 I5 a4 b* K5 d# K
  201.   if string.sub(name, -1) == "/" then! W/ q! M" i+ L: W0 E" ?1 W
  202.     name = string.sub(name, 1, -2)
    5 P: c0 u! [# ~- R3 z' y
  203.    else
    ) U% |8 L' V+ b7 u4 C$ q
  204.     name = string.match(name, "(.-)\n")8 P: S# x3 R& h+ U; j5 X( b
  205.   end
    / T5 E3 D& I4 C' F$ [' R
  206.   if name == ".." then( b2 l# V  O2 u1 }1 ~% {8 n
  207.     path = string.match(path, "(.*)/.+$")
    ( i/ \; F, ?0 Q9 V  X+ F
  208.    else. f( D/ y" H6 ^& w) C. U  L
  209.     path = path.."/"..name0 S! A& c, \% P, K; X* M/ B
  210.   end
    ' d# ?, w) y4 r( h% f1 O8 L5 D6 S
  211.   pop.show() --弹出菜单
    0 h  _1 _' I1 A) ?
  212. end
    1 k7 i: ?( ^! e& J4 K6 V" `

  213. 6 D6 X, i. X; F6 V8 p
  214. --返回父文件夹
    4 j" W4 ^/ [4 M1 v
  215. back_Button.onClick = function
      I2 n. P6 o& c& x+ R4 _+ F% _5 B
  216.   path = string.match(path, "(.*)/.+$")1 Y1 X7 _0 y- Z! q/ V+ f2 O% X
  217.   update()
      I  P9 P0 d1 O" V7 W% @
  218. end" C( C+ _5 K" {. ^/ B. @

  219. ; x. |8 ?3 s1 v* i5 i, S) O
  220. --保存文件
    $ X: ]6 F5 K& T
  221. save_Button.onClick = function
    9 j, {8 z4 u' M. V( H
  222.   local file = io.open(path, "w"); a' }0 M& D. P+ }' R
  223.   file:write(file_EditText.text)
    , B2 F9 }) G7 `4 e5 n
  224.   file:close(file)2 y# ~, Y. m1 n- S# X
  225.   Toast.makeText(activity, "保存成功",Toast.LENGTH_SHORT).show()
    # I# o* w0 L4 s6 g3 i& A) K
  226.   path = string.match(path, "(.*)/.+$")
    , s5 h- v, ~1 ~- T* d& i
  227.   update()
    & ]; g% S4 o5 R8 a; [" f- y
  228. end
    4 q7 o9 X4 q3 I; W! W* j
  229. * ]& o, K6 L) o
  230. --新建文件
    ) y2 l& c* s* N( [" N3 F/ y
  231. addFile_Button.onClick = function5 X& i$ j% c8 ^1 n
  232.   local editText = EditText(activity)- s' v  u9 O2 `' c$ U% D5 j9 ?

  233. 2 i+ q6 o/ V3 @, J% K' c
  234.   AlertDialog.Builder(this)
    ' p9 _5 }& i# a( t4 i
  235.   .setTitle("请输入")$ W* j: G) t8 t
  236.   .setIcon(android.R.drawable.ic_dialog_info)
    / T/ h6 e. ^/ y6 p' |. b7 P; k
  237.   .setView(editText)
    ( ^% s, w7 E/ E$ h8 E
  238.   .setPositiveButton("确定", function
    + J* _# m% F. F# F: F5 y
  239.     File(path.."/"..editText.text).createNewFile(). b, Y( I+ o# f/ x
  240.     update()
    ! A: ^+ X% C# ^/ f: j+ w
  241.   end)- w" }( |4 v4 k/ U8 z% R
  242.   .setNegativeButton("取消", nil), ]' d" z6 c! _- O4 B
  243.   .show();: N+ \0 s/ R  n# e2 j; E! J
  244. end
    " P( m9 i8 d5 M& S! z
  245. - O' T5 d1 _7 ?" O% s
  246. --新建文件夹5 R6 b5 ^1 U7 C* r) ~
  247. addDir_Button.onClick = function- j  r. M1 @3 k; j9 O" F+ K7 U+ P4 v9 j
  248.   local editText = EditText(activity)
    ' Q- n& I$ x! B- d6 Z
  249.   \" L6 D  x( O+ k- ?
  250.   AlertDialog.Builder(this)
    - n3 Z- h6 ]: |% r, J; E1 q& `* n
  251.   .setTitle("请输入")+ L2 L" y2 G9 |, i2 O* o
  252.   .setIcon(android.R.drawable.ic_dialog_info)
    $ {& j  g; i1 F5 {
  253.   .setView(editText)
    ! ~5 X# n& a: @/ j4 j
  254.   .setPositiveButton("确定", function  _$ B6 _; u/ s% @& K5 I
  255.     File(path.."/"..editText.text).mkdirs()# e, k- ^4 O9 t+ A
  256.     update(), H' l# V% D+ `8 h( c6 s' ]8 p
  257.   end)
    & e  u9 ?" l9 b- }' A6 Y
  258.   .setNegativeButton("取消", nil): c+ G# L# f! ~4 a5 k" z
  259.   .show();. ]4 y% B# _" h$ P" U3 T
  260. end
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|星空社区

GMT+8, 2022-8-11 21:53 , Processed in 0.083436 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表