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

登录  | 立即注册

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

查看: 581|回复: 1

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

[复制链接]

441

主题

506

帖子

1944

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1944

荣誉管理论坛元老

发表于 2021-7-1 08:40:19 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. require "import"2 l4 v7 @2 P; y6 d
  2. --import "android.app.*"9 {1 @8 R( ?. H2 O$ n
  3. --import "android.os.*"
    * i* o4 B- _6 l: C3 @9 {# O
  4. import "android.widget.*"
    4 D. p% M5 U: |8 S# ~
  5. import "android.view.*"
    % Z% p7 c8 T- ~9 z$ K1 P

  6. 1 E( j, d7 i1 e+ c% x
  7. import "java.io.File" --文件系统
    , {% w0 d$ Q4 s7 t
  8. import "android.app.AlertDialog" --对话框
    0 U% S4 S9 S4 [$ s7 @# Y- i8 V
  9. import "android.webkit.MimeTypeMap"* C6 F; i1 F2 G
  10. import "android.content.Intent"
    - ?5 z. F. o' i9 V1 f3 X
  11. import "android.net.Uri" --系统打开文件
    4 e0 \, L, X0 E) I
  12. import "com.androlua.LuaUtil" --辅助库 删除文件夹
    9 P+ F% n. ]; N
  13. import "android.text.format.Formatter" --格式化文件大小6 T1 j/ z! |! O/ ^6 A
  14. 5 c6 f$ e3 g) G8 d& u
  15. layout={
    $ D- K+ z5 x2 l/ F2 C5 D
  16.   LinearLayout;1 S) d" M: m/ ?+ a5 I4 ]! ^2 o6 r
  17.   orientation="vertical";  ?& }7 ?+ `% V, |9 Y% n4 u) @/ e
  18.   layout_width="fill";
    % x4 o: l' H& K8 A$ o1 f* I5 {) D
  19.   layout_height="fill";
    9 t" I8 m# @, r. ^8 _! I& |
  20.   {) T6 N' D! u4 e
  21.     TextView;
    6 i" z3 C, F7 g: Z
  22.     id="path_TextView";. N/ T1 O, _- E* @5 m- L8 \
  23.     text="path: /sdcard";2 z; r, L, E1 Z3 r4 k2 _; p
  24.   };
    * y! S) n1 d: ]
  25.   {
    ' f/ M$ I% F; {; c9 `; r& p
  26.     LinearLayout;
    ( `- F: \0 ?/ e9 B
  27.     {
    ) s! g, o' c1 d* c
  28.       Button;
    * P, b( R; I. p$ [8 D" C
  29.       id="addFile_Button";, F, R& s4 s# J1 X% M: Q
  30.       text="+文件";0 L; e4 F9 a4 T3 G
  31.     };
    8 s. N: O, A, i7 |, S
  32.     {
    1 x, e1 m+ P, V' t/ O; v/ i
  33.       Button;
    ( `* e5 G- ^) l' c
  34.       id="addDir_Button";/ h' q  v, O% T. g) u
  35.       text="+文件夹";9 h# E9 s  A7 ^$ I" a, O. h) `' B
  36.     };$ N4 [6 p% ^+ [: @  T/ z# Z
  37.   };
    0 Y* A; m/ t9 k7 R( P
  38.   {
    3 @% u, C4 _3 p: t: ~( w0 K
  39.     AbsoluteLayout;5 u) k! @1 M3 F) i$ \9 E- b7 C
  40.     layout_height="-1";8 W1 t2 E; G- ^! w3 d
  41.     layout_width="-1";. o& J* a4 z! L& a$ O. F# x4 q
  42.     {2 \6 N9 X! f3 ]1 r5 i
  43.       LinearLayout;# _& p. \1 v  T3 z/ p8 _: o
  44.       id="fileEdit_LinearLayout";5 G2 D7 b  j% A
  45.       layout_height="-1";  M9 I5 V# z4 y: P4 I6 _( S) o
  46.       layout_width="-1";
    ! a# \5 b; G& k7 L
  47.       orientation="vertical";
      e6 {5 {. v$ v5 |5 u& P
  48.       {6 K. T0 V- S4 ?' G: q9 I
  49.         LinearLayout;' a) T3 W% g& g5 i+ g, e
  50.         layout_width="-1";
    3 t, }( R, P. ]# Z
  51.         {0 l6 j9 g# Y" A, Q1 R7 x! v: a
  52.           Button;
    " G4 x. O* @. {. L
  53.           id="back_Button";) e7 q# e2 m9 X/ T
  54.           text="<返回";, k* q+ h, M! G% S1 V
  55.         };; {* }9 |5 i1 i' I9 |
  56.         {
    9 h/ g" N( N# j
  57.           Button;
    * O; y1 s. F; B) C8 }0 x0 a4 Z& g" h
  58.           id="save_Button";$ q3 c# _# ?5 `& ~, S
  59.           text="保存";
    % j- S& N3 y# p" G% }
  60.         };
    ! Q: _1 ]% ~  l5 h
  61.       };, B- y: {. {$ l8 K; w0 i, D& }' m
  62.       {( @! @; ?5 o) F- |
  63.         EditText;0 j. N, k4 I* n- a9 w
  64.         id="file_EditText";7 a) L0 v) F! ?
  65.         layout_height="-1";, m& k$ O$ c3 a. l, z9 V
  66.         layout_width="-1";# D( c# H/ ?3 z- E
  67.         gravity="start";2 X: b; u2 L! d  u& I4 L$ A8 ^. C
  68.         backgroundColor="#fffae8";
    8 d3 P: w( m4 W) |
  69.       };
      i3 H- z4 O5 a4 ?1 R0 J1 v8 l& M+ W
  70.     };
    . O& v- u) h" i, c$ z# k
  71.     {
    % W1 T1 P. l, e
  72.       ListView;
    6 p5 z% _% H- n. W( b4 \
  73.       id="dir_ListView";" t8 r8 n5 Y8 v
  74.       layout_height="-1";
    3 a( T1 @  {5 }0 l$ j" q
  75.       layout_width="-1";5 V2 V1 m' g) T
  76.     };+ p3 D! Q' a4 j; N) R
  77.   };
    ) \% _0 m7 o% ~' H5 P' }
  78. };) B( Q; ]" F' q; L8 [1 o( I
  79. activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题
    & J9 _; R6 S: F
  80. activity.setTitle("文件管理")
    ! l2 y7 q1 Y( {3 O( X
  81. activity.setContentView(loadlayout(layout))
    ; p7 T" `5 i8 M- U! j8 _  a* d

  82. . K% N3 @/ o% z5 p
  83. - O5 j9 U0 c  v; M5 }/ p
  84. local path = "/sdcard". u, k# A5 q0 y
  85. local adp = ArrayAdapter(activity, android.R.layout.simple_list_item_1)0 ~% D7 d# _0 A# o. v; d2 y$ X2 O
  86. dir_ListView.setAdapter(adp)" C/ i1 I% ^. _2 B1 i

  87. 4 q( L8 P' \+ O9 i) D1 L
  88. function update()
    . v. z6 k: B+ e6 e) g
  89.   path_TextView.text = "path: "..path0 Z9 g. c$ }( x+ \2 d4 X
  90.   if File(path).isDirectory() then --打开文件夹
    : p' L3 p7 X2 G
  91.     dir_ListView.setVisibility(View.VISIBLE)3 s# b5 H- u; X0 d$ ~% f# l
  92.     fileEdit_LinearLayout.setVisibility(View.GONE)" n3 f" W' v$ w- ]- @! m

  93. # Y. S) X0 d+ |
  94.     adp.clear() --清空
    " b; M. q* D  w! w6 p* V
  95.     adp.add("../") --父文件夹
    8 S  F; |2 b4 W, ]8 U
  96.     local ls = File(path).listFiles()
    0 R3 f' s* y  f' q
  97.     if ls then --不为空
    . e2 N1 ^; }) O" |0 L, O/ [; r. n
  98.       local fileList = luajava.astable( ls )& e. }& k! e; h
  99.       table.sort(fileList, function(a,b) --排序. x. {8 V. `7 \
  100.         return (a.isDirectory()~=b.isDirectory() and a.isDirectory()) or ((a.isDirectory()==b.isDirectory()) and a.Name<b.Name)
    ; u6 b+ F5 a7 P: V
  101.       end)
    * P* b2 N( J; d. e
  102.       for i,v in ipairs(fileList) do
    ; Y- @% y5 Q. A3 r. r# [8 p
  103.         if v.isDirectory() then --文件夹
    ; g& H3 k5 ~5 D% \2 j
  104.           adp.add(v.Name.."/")
    8 |; F' c% G+ o* G& F. q+ c
  105.          else, i  Y( ^% t# M
  106.           local cal = Calendar.getInstance()2 y6 s( N% ^4 Y0 I
  107.           local time = v.lastModified() --最后修改时间
    / t6 h8 B  r& n+ `2 _  E$ U( b
  108.           cal.setTimeInMillis(time)5 T% r7 |4 y" E8 ^0 `" M3 N
  109.           adp.add( v.Name.."\n\t\t\t"..Formatter.formatFileSize(activity, v.length()).."\t\t\t\t\t\t"..cal.getTime().toLocaleString() )
    . H0 s0 i; _; d" O* H
  110.         end1 w& L$ K# K+ _8 y+ v9 @. ]
  111.       end
    " d$ I- `( o5 d# h0 w3 v$ L
  112.     end
    # l# l: _. g/ W3 F: D! e
  113. 4 f5 w' d! p9 V' H
  114.    else --查看文件9 @$ R1 E9 m: d8 Y
  115.     dir_ListView.setVisibility(View.GONE)+ t4 L+ _/ r" L% H3 `0 I
  116.     fileEdit_LinearLayout.setVisibility(View.VISIBLE)
    % P- R  M* U: B( M& O$ Q' \
  117.     local file = io.open(path, "r")$ f2 {3 Z, l! E4 X
  118.     file_EditText.text = file:read("*a")
    8 p2 ]1 M1 [  o9 `5 u  _8 B
  119.     file:close(file), k3 u% t% N' K+ G5 o! F9 r
  120.   end
    ( V, ~( K! k" W( |2 y. Q
  121. end  x" t% ^9 k/ m1 I/ x7 ]
  122. update()
    % _# H: O! k/ f3 u- L2 p6 G

  123. : o! F$ G7 s8 e
  124. --系统打开文件3 E) z# j% Z( a  j/ _, `
  125. function openFile(path)
    0 l$ w9 W3 @' k2 l8 o
  126.   local FileName = tostring(File(path).Name)6 E5 ]% H7 i* i+ u
  127.   local ExtensionName = FileName:match("%.(.+)")
    2 a0 I  u, x3 U+ c
  128.   local Mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ExtensionName)
    ) B4 q0 v% h( R# _3 r7 j% F
  129.   if Mime then
    * V4 p2 w$ I# q3 J# U/ v6 ]( r9 C8 A: A: ^
  130.     intent = Intent()5 J+ `: j; K" g
  131.     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    4 f1 ]' h; Q, ~! S5 W# v  E2 {4 K
  132.     intent.setAction(Intent.ACTION_VIEW);: W. {; a. Q7 Z. I1 p4 l8 V
  133.     intent.setDataAndType(Uri.fromFile(File(path)), Mime);
    $ o7 U- b  n& {; r7 E! Z
  134.     activity.startActivity(intent)! I8 e/ s' {% c: `
  135.     return true
    % X7 f, F* s; u, }( |
  136.    else
    . |8 N' h2 k! D/ R# g
  137.     return false2 m, Q7 R( H$ i9 P$ {$ K7 ]
  138.   end
    ' P6 T9 R% ~+ q+ h/ d2 k4 L
  139. end
    9 i' d7 j, B. n

  140. 5 L: ]8 F/ n3 W; C; A* K
  141. --列表点击事件
    " T* ^  M8 h# x7 M8 p
  142. dir_ListView.onItemClick=function(l,v,p,s)
    8 J* |: @& O: Y" g9 L" E2 K
  143.   local name = v.Text7 f2 K& x9 h% z- |, H
  144.   if string.sub(name, -1) == "/" then
    - L' C* w( k2 G1 t9 E. \; j% c
  145.     name = string.sub(name, 1, -2)
    ; A8 I5 O* o2 n- K* A
  146.    else
    & ?4 B  u( W/ P6 U& |
  147.     name = string.match(name, "(.-)\n")# G/ i, [, d. n6 J" n7 {2 n
  148.   end
    5 T$ \3 f7 ?$ j9 q" J
  149.   if name == ".." then
    + U3 {9 M5 L* e0 i1 `$ C3 K
  150.     path = string.match(path, "(.*)/.+$")
    / p4 J) f2 l: v/ }; G, C
  151.    else
    # M- {( p$ Q3 M
  152.     path = path.."/"..name
    ) o3 H8 I. _1 X* a0 `
  153.   end# o* v+ g  O# w, z) x) V
  154.   update()
    5 i7 a1 N& s' i# g8 t4 o
  155. end0 S5 F6 k5 V1 t' H* ~- ?9 k, b4 k

  156.   Q/ q; A5 |- R) o' {7 J* |
  157. local pop = PopupMenu(activity, path_TextView) --弹出菜单1 B/ C4 t* D  S, x
  158. local menu = pop.Menu, [# U3 L" W0 z9 @  n
  159. --系统打开
    4 M, M2 B) W% ]2 S6 ~: I8 I! P: O
  160. menu.add("打开(系统)").onMenuItemClick=function(v)3 P( g  Z5 d! g
  161.   openFile(path)1 }2 Z. Y/ Z1 ^! i" ?
  162.   path = string.match(path, "(.*)/.+$")/ c4 o8 H$ {/ V" C
  163. end' u% h) \3 G/ o( G! z5 w7 N
  164. --删除文件/文件夹. L* }$ D. s& v( t2 c+ t4 \+ p
  165. menu.add("删除").onMenuItemClick=function(v)7 S/ ^8 |& U! p. U! V6 I
  166.   AlertDialog.Builder(this); k  O6 O* b2 _0 t: s
  167.   .setTitle("真的要删除"..path.."吗?")
    & B5 K& e6 D) s  m3 i
  168.   .setMessage("(将无法恢复)")
    9 m9 }7 N6 f+ Y
  169.   .setPositiveButton("删除",function
    ) ~$ o; W* ~  A
  170.     LuaUtil.rmDir( File(path) )) x+ A" b- t2 h: a9 ^
  171.     path = string.match(path, "(.*)/.+$")
    6 D0 U6 q' `+ B! A$ B1 f. Y
  172.     update(); W5 W7 G& \; T0 V
  173.     Toast.makeText(activity, "删除成功",Toast.LENGTH_SHORT).show()8 C" D/ F+ G8 M2 W) x& X
  174.   end)2 D' Q5 v0 P5 N1 I% P2 n" j" m6 Y! U
  175.   .setNeutralButton("取消",nil)
    4 W! {# E/ o4 d2 G7 n) F; f
  176.   .show()
    " i1 T7 @% _  E3 n; X
  177. end
    $ O) k7 j! x2 Z& O
  178. --重命名/移动文件" B9 ~3 o2 @5 t% L1 T
  179. menu.add("重命名/移动").onMenuItemClick=function(v)' U8 v5 L3 r8 g" b+ E
  180.   local editText = EditText(activity)3 ?/ j5 [7 s7 J

  181. # ]' F4 z3 i: A9 L) `  P, l. q
  182.   AlertDialog.Builder(this)
    2 C* Z4 }7 c$ r1 D, s3 S6 i
  183.   .setTitle("请输入")
    ) s- W: w, {# K4 n- ~& m$ T
  184.   .setIcon(android.R.drawable.ic_dialog_info): q6 j5 r1 g8 [; M# N
  185.   .setView(editText)
    % Q6 o( Y1 A, f% H
  186.   .setPositiveButton("确定", function
    3 ?; L6 [9 b1 W7 P7 s) [/ h
  187.     File(path).renameTo(
    ' `7 h2 [8 g! s
  188.     File( string.match(path, "(.*)/.+$").."/"..editText.text )
    + u5 t- o7 L$ M  c
  189.     )
    & W+ u2 B4 X  Q% ^8 P
  190.     Toast.makeText(activity, "移动成功",Toast.LENGTH_SHORT).show()
    ( G+ `: ^! I- C4 \' f+ a% l+ D
  191.     path = string.match(path, "(.*)/.+$"), h$ u$ B8 g. n" e4 f2 G! `% B2 O  q
  192.     update()+ V# {" u+ W, C+ L9 X
  193.   end)4 C# t1 ?& _8 a4 F6 G8 K6 H
  194.   .setNegativeButton("取消", nil)6 t6 E$ k. \7 f
  195.   .show();
    2 l) ^, V$ W# f! \3 e& P: @' m
  196. end
    7 b$ T+ f) p6 \; Y' i  M% D

  197. . W+ n1 H6 c+ d+ l
  198. --列表项目长按
    * t5 z* H- h& _) K6 |" ~" q; Q) G
  199. dir_ListView.onItemLongClick = function(l,v,p,s)
    $ o' B9 J0 M  J5 I# p: {* k- c9 i
  200.   local name = v.text$ x6 W2 i3 D! N% _0 i! R; n. A
  201.   if string.sub(name, -1) == "/" then
    , X# e& }0 \8 e
  202.     name = string.sub(name, 1, -2)) p, P& d! z6 O
  203.    else. O, |& L2 g4 t, C: F
  204.     name = string.match(name, "(.-)\n")
    7 @) @0 j& B" d3 G9 L0 G/ [
  205.   end
    - `" n* |+ z4 B. u, z& |8 t  ?9 y7 O
  206.   if name == ".." then3 @6 v* c" G; w, ?/ u
  207.     path = string.match(path, "(.*)/.+$")9 r8 K7 s9 @$ Q( s7 p! l- N
  208.    else
    5 s+ h! m7 y7 t* t& P# `
  209.     path = path.."/"..name
    & W+ f% G4 U/ X2 E
  210.   end  x( d# I5 Y; l, c6 p
  211.   pop.show() --弹出菜单0 Y) w0 C0 n  k+ q1 ^% j
  212. end1 a( I3 \0 S3 `1 n; w

  213. / G5 V5 o% \7 N" a
  214. --返回父文件夹" T, m) g+ ~9 a: {- E" {( J7 Z
  215. back_Button.onClick = function
    % K6 b/ m; T: R' {+ `+ R% G
  216.   path = string.match(path, "(.*)/.+$")* m. J( |* ]* V8 Y
  217.   update()+ Z2 r% n1 r9 Q' b6 x4 F7 w
  218. end
    ( r' `3 q% q8 z( a# W
  219.   i. T* G, ?; }$ @
  220. --保存文件
    " h- w  ^5 ~" `2 P' v7 s/ ]5 ?/ s4 M
  221. save_Button.onClick = function6 G7 r: @" e0 Q  D% @+ c6 z/ ~4 w+ }; u
  222.   local file = io.open(path, "w")
    2 J, {( a# D) J
  223.   file:write(file_EditText.text)
    5 n4 r. V, o4 X2 [5 O1 f2 c/ h& w) ?
  224.   file:close(file)" h* R5 p- X5 f8 s
  225.   Toast.makeText(activity, "保存成功",Toast.LENGTH_SHORT).show()2 V9 q, a2 {! ]) ~5 d$ T3 b
  226.   path = string.match(path, "(.*)/.+$")
    ) c1 r# S2 v5 I2 t* C
  227.   update()7 D/ p! A3 q! T# ?5 @
  228. end
    & G& R9 _( M/ Z( C9 V" x
  229. 7 k, R* _# t: c, @, u
  230. --新建文件9 Q# s5 R" u; }
  231. addFile_Button.onClick = function
    0 N* z" o7 P2 U9 O
  232.   local editText = EditText(activity)
    . \% L- u9 U- R  x) g

  233. + P$ ]& W$ Q$ i3 m+ e' n, R
  234.   AlertDialog.Builder(this)
    6 S8 O8 {+ E2 B
  235.   .setTitle("请输入")7 c* D! C8 K9 |1 }. U
  236.   .setIcon(android.R.drawable.ic_dialog_info)% z  Q9 a' P8 a6 K
  237.   .setView(editText)7 e8 T5 f/ ~8 d& i- B' a
  238.   .setPositiveButton("确定", function7 E/ R& F" _" h4 t0 v
  239.     File(path.."/"..editText.text).createNewFile()
    ; ?1 T& {+ `& ]) [4 ]5 _9 k
  240.     update()2 P% v  v# o% v$ X/ e6 \" H- h
  241.   end)5 ~( Y- j- J, m
  242.   .setNegativeButton("取消", nil)
    / y7 V. h/ q2 M0 t$ |' e
  243.   .show();
    ! e  n1 z) j" c) {: W
  244. end' k0 y2 o# }, y- l& x
  245. ' `" |# r- |7 y7 r5 r) B) Q7 ?- b
  246. --新建文件夹
    , X: {) g$ {7 z( c
  247. addDir_Button.onClick = function
    ; K! ~0 _* H3 ]0 Z0 ^2 ^
  248.   local editText = EditText(activity)7 i" u7 m! U' I) d& w& ]
  249. ; I/ H" T! c, b( G" K
  250.   AlertDialog.Builder(this)
    9 f  Y! m) Q& B. t+ e+ d" c
  251.   .setTitle("请输入")$ F1 @4 m4 v* x  Y
  252.   .setIcon(android.R.drawable.ic_dialog_info)6 h$ ?# }* M1 i5 R9 X
  253.   .setView(editText)& @% Z1 o  x6 U" ~
  254.   .setPositiveButton("确定", function
    : o- b7 w  X( G6 ]  J: f1 G/ ^
  255.     File(path.."/"..editText.text).mkdirs()
    & A8 W# p7 ~0 U$ V8 o. j
  256.     update()6 v% s6 u' ^4 H) [7 f
  257.   end)
    / ]7 A+ b4 C) Q9 }0 \
  258.   .setNegativeButton("取消", nil)& e) ?& E! g4 S3 E6 P
  259.   .show();
    2 K( |2 L3 O# C. b4 [/ W
  260. end
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2022-8-11 22:05 , Processed in 0.084245 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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