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

星空社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 468|回复: 0

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

[复制链接]

407

主题

472

帖子

1622

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1622

荣誉管理论坛元老

发表于 2021-7-1 08:40:19 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. require "import"- u2 S/ F6 W. D9 K5 a" _
  2. --import "android.app.*"
    , P3 F2 m9 E& |  f6 f/ t5 c
  3. --import "android.os.*"1 O* i' A" S' e* i4 H
  4. import "android.widget.*"
    - f! n. n* x) f: o" q
  5. import "android.view.*"0 e+ E0 N* E$ @* E) N
  6. 0 ~# R) C* _' H0 s! Q
  7. import "java.io.File" --文件系统& \% S" M. Z7 S/ ?
  8. import "android.app.AlertDialog" --对话框
    ; n+ x- \) y$ ^, j
  9. import "android.webkit.MimeTypeMap"( s! A* {% {! a- }5 {0 Z
  10. import "android.content.Intent"7 t; @8 l+ O1 ]2 P# k
  11. import "android.net.Uri" --系统打开文件
    * b2 Z9 C. L3 F9 o
  12. import "com.androlua.LuaUtil" --辅助库 删除文件夹
    / \" L8 L6 O5 o* p! a' {1 L
  13. import "android.text.format.Formatter" --格式化文件大小
    * l: r; l- w" n8 `+ n; g

  14. 4 w. z) g' i3 y7 o! v0 k
  15. layout={
    ) E$ H1 _/ s  l; r, E  w$ K0 A
  16.   LinearLayout;
    ( C+ y( n; `( S! X% d) A2 I
  17.   orientation="vertical";
    2 s$ H+ Y/ [. ?; [/ g* [
  18.   layout_width="fill";# t5 [. K, P7 o5 r  o( l% Q
  19.   layout_height="fill";5 }- W4 h/ R0 |- o3 B. @* `7 X
  20.   {
    2 I4 Z$ G% A9 C( }. f
  21.     TextView;
    ! w0 f+ Z$ \8 l- l( d4 P" k
  22.     id="path_TextView";
    ) g$ T9 N+ s4 l& n- Y% j0 e
  23.     text="path: /sdcard";8 a! c  r9 J% \2 H4 Q
  24.   };
    & z, z' n) e& r
  25.   {7 g# |, a2 ?) o1 [- y4 L: X0 \
  26.     LinearLayout;+ `3 d' _1 M' t8 M
  27.     {
    " L9 m( c* E/ J0 `7 Z2 m9 g
  28.       Button;  w2 a/ y! c; }1 R* x: k% z
  29.       id="addFile_Button";' O; o8 t1 ^7 \; ?4 ~6 g
  30.       text="+文件";' {1 s0 V% U" f7 s' |+ |) s# T
  31.     };/ w& B3 @) W2 P' C) `9 |
  32.     {* ]* Y/ \, W1 q: m8 o
  33.       Button;
      @0 H, L* p* r1 h
  34.       id="addDir_Button";
    1 O1 N2 F, h% n3 `4 S
  35.       text="+文件夹";
    7 @3 B3 _) ?$ R7 S9 o
  36.     };% R. X) p, V% j/ H2 H
  37.   };1 e8 ]) m5 I1 J+ w1 f* ^) v
  38.   {
    " X# e( P6 u/ n6 G# w4 c
  39.     AbsoluteLayout;
    1 I( {( G! _, u, C8 Q
  40.     layout_height="-1";
    8 ]0 J% ]: b* V
  41.     layout_width="-1";
    # |* j9 V1 Y7 I# N! j# G
  42.     {
    : o) B% G. b5 U# _8 L# T7 z
  43.       LinearLayout;
    & _# X) Z  g' m
  44.       id="fileEdit_LinearLayout";! |& l& |6 a' s# P0 B! p
  45.       layout_height="-1";0 L0 A4 Y5 w* R/ c, \! A$ S
  46.       layout_width="-1";5 X$ }5 f0 U# \( D+ S/ ?
  47.       orientation="vertical";
    9 o6 ]0 v8 m4 i5 }( V
  48.       {
    ! c5 N) t% u: _. S% [+ a
  49.         LinearLayout;
    $ X: N) _' L2 ?# I5 J5 L# f" n! B7 t
  50.         layout_width="-1";6 z; p% e% W, e/ Y' [- \' f
  51.         {5 n& g# N. d% z* c+ r2 ^
  52.           Button;/ @5 F! n/ e) a0 \# {" z
  53.           id="back_Button";: v$ c4 n% e% i( h7 _
  54.           text="<返回";
    & {3 u2 A" y1 X) r* k* n$ g  G
  55.         };
    4 Z! S0 y- _, \# U
  56.         {
    ; u9 Z; ~& d2 |* K0 C
  57.           Button;
    + ^2 K9 }8 }  D/ P1 l6 t% i
  58.           id="save_Button";8 g5 i9 d4 a: c# g# ]' ]+ Q! }
  59.           text="保存";
    0 X$ F7 u5 R2 y2 n# V( u
  60.         };* [: G) v: b4 B9 f
  61.       };
    * o8 X5 v2 @) @* v$ k# D
  62.       {
    6 F0 ]" ~( q' G' z5 A
  63.         EditText;6 u6 A* W7 }( b7 t' B7 T
  64.         id="file_EditText";
    # c2 l# X2 C$ v: p6 |5 i
  65.         layout_height="-1";
    ; o# \& C: {+ }( b" m2 D) ~$ h
  66.         layout_width="-1";- M( z+ z# L- z: p( s
  67.         gravity="start";
    6 E9 d. L* P8 {) [, [/ |
  68.         backgroundColor="#fffae8";
    . h) s! u/ ?9 M: }5 G
  69.       };
    2 d1 c' G( k$ F  C
  70.     };9 j! S  K! G# K6 p* A2 B) u8 _
  71.     {4 H9 s: x" Q! _7 i
  72.       ListView;
    # v) i: S/ I: ~1 h4 B. D/ e
  73.       id="dir_ListView";- A% T2 R4 ~0 P) l- n6 d9 c/ f% ]
  74.       layout_height="-1";
    ) j) i& W; t& R' a
  75.       layout_width="-1";
    * \( ?' F. }8 S! l( n
  76.     };
    3 F% i; ]. S  e# q! t" V
  77.   };. Q: I) P0 a) n' R9 [9 a4 ]! e9 u
  78. };
    ; b8 F4 G; g1 k; S# y
  79. activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题- X6 E4 N4 k! F
  80. activity.setTitle("文件管理")
    % o7 N2 Z: [; }! ]  L' |
  81. activity.setContentView(loadlayout(layout))! N% F% H* D4 P- H! Q
  82. - U! e+ _5 I' u( C  @/ U) K
  83. 3 H5 J6 U) o: |$ i7 S% i
  84. local path = "/sdcard"2 F7 ?) a# o0 b  _) f# j% I
  85. local adp = ArrayAdapter(activity, android.R.layout.simple_list_item_1)5 A8 \3 T2 y+ [+ `+ }3 u) `
  86. dir_ListView.setAdapter(adp), s4 T( g' ?' G1 ^
  87. 4 @2 `' O3 e0 C' k' t% E
  88. function update()5 v2 d+ n7 w8 x6 }
  89.   path_TextView.text = "path: "..path
    , ]# s9 W  b9 t* b
  90.   if File(path).isDirectory() then --打开文件夹2 t; {. @8 l* c3 R; c
  91.     dir_ListView.setVisibility(View.VISIBLE)  g, Z; y9 O- H2 O" l
  92.     fileEdit_LinearLayout.setVisibility(View.GONE)1 H# x/ L' z; R- u, @, R
  93. ( S/ r, E% _% s+ ?0 c# [9 [7 o
  94.     adp.clear() --清空9 H4 Y+ M7 B4 a  A, a2 j
  95.     adp.add("../") --父文件夹
    2 t8 }4 I" W" a3 l+ b
  96.     local ls = File(path).listFiles()& T6 L6 g, S; x4 N
  97.     if ls then --不为空
    . Z+ Z. ^' P2 B# i. k: [( c2 t
  98.       local fileList = luajava.astable( ls )
    2 L( D$ a# F+ e1 @7 r; s
  99.       table.sort(fileList, function(a,b) --排序
    9 ]- k3 F6 ?9 S5 H$ _
  100.         return (a.isDirectory()~=b.isDirectory() and a.isDirectory()) or ((a.isDirectory()==b.isDirectory()) and a.Name<b.Name)
    1 i" h' x9 y) I$ R) ~
  101.       end)
    8 D0 ]# s" V) A- Z; p( B5 C1 u0 v
  102.       for i,v in ipairs(fileList) do- e2 ]4 ]9 F! |% b
  103.         if v.isDirectory() then --文件夹
    " C$ r% e' {3 y: _! Z
  104.           adp.add(v.Name.."/"); v: L! |: ?6 n( ~' K: ]
  105.          else
    / ?3 y* p' j5 t: F. [1 h
  106.           local cal = Calendar.getInstance()$ u/ R* N+ |* h5 H9 W: k8 o
  107.           local time = v.lastModified() --最后修改时间
    $ S1 R, Q" t" r& p4 v
  108.           cal.setTimeInMillis(time)* M2 O. h4 _6 y4 a
  109.           adp.add( v.Name.."\n\t\t\t"..Formatter.formatFileSize(activity, v.length()).."\t\t\t\t\t\t"..cal.getTime().toLocaleString() )5 q! r7 @, n1 S( F
  110.         end
    3 x8 V: c1 _$ G+ C. F$ X: V+ R8 n
  111.       end
    3 ^  ?" T7 f' Y* W  u- S" p
  112.     end% j* R, f5 [2 a$ t" r' d( |
  113. ) H8 j2 J5 b# E; P4 d
  114.    else --查看文件  h& _( K) a* l- G) D
  115.     dir_ListView.setVisibility(View.GONE)
    # ?4 K" \% o8 y  l
  116.     fileEdit_LinearLayout.setVisibility(View.VISIBLE)
    6 H5 G+ r! F6 f  |' S- C( f
  117.     local file = io.open(path, "r"): E+ x1 H- w; e) ^# v; G3 ]
  118.     file_EditText.text = file:read("*a")
    & }% T, w$ W9 K# B
  119.     file:close(file)7 _/ r5 S0 O1 \& }, B$ N6 t3 h
  120.   end
    : O$ G2 S; [- n7 F9 Y
  121. end6 i: H: A6 c+ e0 h+ z
  122. update()
    ) D0 [5 z5 I' ~! f
  123. 9 M1 R- q7 L% ]9 s  J
  124. --系统打开文件
    $ d+ w) r& u& Y" a
  125. function openFile(path)
    7 A- }- O4 P+ _* @5 b% m- Z3 C
  126.   local FileName = tostring(File(path).Name)
    4 o- t/ D3 P) \% ~
  127.   local ExtensionName = FileName:match("%.(.+)"). Y( I2 n0 }9 ]8 N7 d) A8 n% X7 J: z$ p
  128.   local Mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ExtensionName)$ x0 F9 `7 x% X5 l4 `- t5 ?: O( k
  129.   if Mime then
    # \; e& v/ Z4 w$ _& B) o8 w* q
  130.     intent = Intent()
    1 r* N! ~9 |: K# e. @* A; ~
  131.     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)5 K" M, G# G( N- k
  132.     intent.setAction(Intent.ACTION_VIEW);9 l& d! j+ X  M8 {& g" s: y
  133.     intent.setDataAndType(Uri.fromFile(File(path)), Mime);
    1 K! B' I% M' M. m, {1 V# Y4 d+ j
  134.     activity.startActivity(intent)
    ' U2 O/ v0 j. @2 y* g5 n3 t
  135.     return true
    0 A; w5 O5 R. F! I" [* F
  136.    else
    9 {0 j% Z/ z/ S# s9 y9 K
  137.     return false5 G7 H4 l1 v5 [) h" O6 b' c
  138.   end0 E6 n* t' C3 V% T' r3 y
  139. end$ h; x( H" J, @' t2 Q+ D+ J

  140. ! q" I& A% H' m2 c$ V0 y  v
  141. --列表点击事件5 G, b* C5 _  }: G, i# V% f3 d
  142. dir_ListView.onItemClick=function(l,v,p,s)' i# Z( b. m/ G4 F
  143.   local name = v.Text1 [0 ?) _; k' S/ X6 R  j7 D' K
  144.   if string.sub(name, -1) == "/" then9 I' ~4 W, l. a, p! ^" n
  145.     name = string.sub(name, 1, -2)
    ( f! W" X* |  N/ ]/ q- E2 z
  146.    else" s. s$ ^. G% G( C  N9 i& O
  147.     name = string.match(name, "(.-)\n")" y& R3 O1 ?* \
  148.   end
    1 _% d- i% E% |- i% D
  149.   if name == ".." then) t) Q0 e6 ~7 a) y1 v+ e
  150.     path = string.match(path, "(.*)/.+$")4 @9 D! I5 M% j0 q3 ^+ V
  151.    else
    4 g4 c1 {: n% Z4 m  a9 |
  152.     path = path.."/"..name
    0 k, A8 t! O4 Y/ v; w3 a
  153.   end' p; S" ]$ s  f9 k+ D
  154.   update()( J5 L' j; Q  v4 u
  155. end+ ]' S' O* [0 F! U" p* ]

  156. % e' s, O2 G& B1 L& \* H
  157. local pop = PopupMenu(activity, path_TextView) --弹出菜单
    8 E+ s0 h& o$ Q# i; Z- B6 i; W/ j  k
  158. local menu = pop.Menu7 A/ f6 x+ Z- L; ^2 e1 ]: P
  159. --系统打开
    ! ~2 Z* [6 f- a4 L5 G4 u0 s- _
  160. menu.add("打开(系统)").onMenuItemClick=function(v)
    ' Q) F  R" Y1 d  k* E" T. {
  161.   openFile(path)1 ^  q# N9 Y/ w2 u; b
  162.   path = string.match(path, "(.*)/.+$")! z9 d4 Z3 w3 C1 x3 _/ N
  163. end
    ' i5 l( [1 h1 x5 ?; B& I
  164. --删除文件/文件夹1 c1 J2 s; g, ]( s( j* O4 W1 x$ K
  165. menu.add("删除").onMenuItemClick=function(v)6 m2 i) ?/ w; K# Y: _8 f9 x; S# x0 x
  166.   AlertDialog.Builder(this)* b, c! K- w8 i7 `( z9 N, T
  167.   .setTitle("真的要删除"..path.."吗?")
    5 U! z; W. J9 R5 `
  168.   .setMessage("(将无法恢复)")
    3 ?. Z! {% k- }5 F
  169.   .setPositiveButton("删除",function
    3 m1 j: D, c' ~8 }+ Q9 F
  170.     LuaUtil.rmDir( File(path) )
    ( c' f) F2 [1 S) |
  171.     path = string.match(path, "(.*)/.+$")
    & b3 ~! a0 c- r; W; _2 x
  172.     update()0 a, ^0 X0 t0 S( w2 ]' R! n/ c
  173.     Toast.makeText(activity, "删除成功",Toast.LENGTH_SHORT).show()
    ( Q4 E& l' G; n) ^/ x
  174.   end)) G4 |' ^: E3 T& p
  175.   .setNeutralButton("取消",nil)
    6 T- g# r# m  R! K
  176.   .show()
    & M! a5 N) o' B4 k
  177. end
    ( t6 @+ p3 F$ n* J7 o& e
  178. --重命名/移动文件
    ! n% E6 Z* _# y; F
  179. menu.add("重命名/移动").onMenuItemClick=function(v)
    1 E$ V9 f/ u7 x! p+ j5 P' O
  180.   local editText = EditText(activity)) C4 f: ^* }+ I4 b9 L1 F. t
  181. & r- i* @$ B3 Q0 ]
  182.   AlertDialog.Builder(this)& C  b( s4 f/ S/ c; @; d2 ~
  183.   .setTitle("请输入")& f0 R7 f  B2 I* d
  184.   .setIcon(android.R.drawable.ic_dialog_info)
    3 A# F- x3 j: [$ ]7 o& u
  185.   .setView(editText)
    / ~) z0 ]5 I. x- s- O( B
  186.   .setPositiveButton("确定", function
    : \6 p: P! ]% [/ h
  187.     File(path).renameTo(
    9 h; {( Q( H; D6 S8 I0 e
  188.     File( string.match(path, "(.*)/.+$").."/"..editText.text )8 y2 c& ~& \6 z, X& O0 h
  189.     )
    . i- m  P! q1 r1 s! q, f) y
  190.     Toast.makeText(activity, "移动成功",Toast.LENGTH_SHORT).show()
    % `* `% j9 X9 ~8 E. `; H
  191.     path = string.match(path, "(.*)/.+$")
    1 [3 u, p5 U+ ?9 _0 |" A1 ]
  192.     update()
    ' R0 _) m$ n5 \
  193.   end)2 M( m" m$ q# d9 k& v
  194.   .setNegativeButton("取消", nil)& f: E9 a: ^: p" v
  195.   .show();& f' }% T# P& m
  196. end
    / Z/ Z# l  v9 j! B

  197. ! i% E) R/ e4 C8 U
  198. --列表项目长按
    + H* J& m) f. v: _% `5 x$ l
  199. dir_ListView.onItemLongClick = function(l,v,p,s)
    , g- ~- a, T/ E
  200.   local name = v.text
    3 y$ Q9 _# w% O! M3 }+ p- k. V
  201.   if string.sub(name, -1) == "/" then: x! S/ O/ y; X% w# z# F
  202.     name = string.sub(name, 1, -2)
    5 p2 C1 ~5 A7 b% }) p8 N% I( G
  203.    else; a( z+ I9 T. F9 \5 R( ~, F' F* Y
  204.     name = string.match(name, "(.-)\n")
    # w  V% U3 D0 f
  205.   end0 z0 c4 o8 x4 S  q/ ]/ g' `" Q" p3 ?
  206.   if name == ".." then/ b2 p% y( x$ @1 v; q7 b
  207.     path = string.match(path, "(.*)/.+$")
    & H7 X( X' R; r. u
  208.    else
    * w  A5 t7 u7 Z. }
  209.     path = path.."/"..name8 S5 C, l7 j5 |! P9 V2 J: Z7 i
  210.   end
    # q  u4 i1 t1 S7 l
  211.   pop.show() --弹出菜单
    ' }& c2 K4 \& A, J
  212. end
      s4 y. K0 N) e- c
  213. 7 U+ r$ R" y% h% I
  214. --返回父文件夹, C( t! Q% u# y
  215. back_Button.onClick = function
    % j0 @. K1 `; u" A0 \& x
  216.   path = string.match(path, "(.*)/.+$"): A% e0 ?" A& t4 T; L
  217.   update()4 f. D% W9 y" P4 [, a
  218. end$ c: Q! F$ D& K9 j7 ~( ?8 G
  219. 7 d( @4 J$ x& |. H0 H: B
  220. --保存文件
    , G# T& H2 l7 U* g' D
  221. save_Button.onClick = function2 l8 P0 K& m( e! J6 A9 n
  222.   local file = io.open(path, "w")3 k9 ~1 I6 D( `
  223.   file:write(file_EditText.text)) D5 H( p: e6 b0 F3 B( _
  224.   file:close(file)8 {) p' C( |; \3 B: j
  225.   Toast.makeText(activity, "保存成功",Toast.LENGTH_SHORT).show()
    8 Z: l! v2 b, a
  226.   path = string.match(path, "(.*)/.+$")
    $ I) `0 i  i5 }9 p* Z. o' _# x) r* [
  227.   update(), F$ {! {7 L! z" Y& b
  228. end
    $ G! L$ q( C" e. P! H! |7 A

  229. # v" y8 C+ b) X, a! [* |, q
  230. --新建文件! m( t/ J. G8 [9 @3 j* u
  231. addFile_Button.onClick = function5 Y$ u0 W$ P2 D2 M/ Q6 Q& Y' R
  232.   local editText = EditText(activity)% w1 M4 H5 w) F! f. _" K
  233. 7 w: m+ X4 t% |; Q4 {
  234.   AlertDialog.Builder(this)
    ! `4 d- ~# b* v$ _) x5 t9 ~& l1 |
  235.   .setTitle("请输入")
    & _# _/ K! R/ P: c
  236.   .setIcon(android.R.drawable.ic_dialog_info)
    * \9 R( i9 A- a( K3 c$ \' g. T
  237.   .setView(editText)
    , m! [" G5 O% |, U, N: W# l4 V
  238.   .setPositiveButton("确定", function
    - h" @# Q7 D7 I1 ]0 z$ \
  239.     File(path.."/"..editText.text).createNewFile()
    8 R; V6 v1 q6 E; ]8 b
  240.     update()
    # I4 v+ Q+ ]6 I  q, v  z# v
  241.   end)
    + f* S) \* l: w/ m& @$ G* Y: \
  242.   .setNegativeButton("取消", nil)
    0 F& u/ Q) G3 ^) c9 q/ t
  243.   .show();7 ?' d+ v8 O& y( L! @
  244. end
    6 u3 g0 L" m; X' F6 p' R

  245. # f7 G# Z8 L3 Z: I" l
  246. --新建文件夹
    9 ?: c+ l8 E& f8 `/ G
  247. addDir_Button.onClick = function
    ! {. A" w5 \+ F% U5 h  `
  248.   local editText = EditText(activity)
    & f9 l0 o" S' c  _4 y
  249. ) b! x- W+ ^5 h$ S
  250.   AlertDialog.Builder(this)/ t3 H% z6 R1 u) o1 d( y* F8 |
  251.   .setTitle("请输入"), @/ W" Q  u: C9 f
  252.   .setIcon(android.R.drawable.ic_dialog_info)
    7 F" O* n/ `- B" d; j* |
  253.   .setView(editText)3 W" ]0 `( k1 v/ S
  254.   .setPositiveButton("确定", function( N) s& W& ?* p
  255.     File(path.."/"..editText.text).mkdirs()  c8 G3 Q* b0 }6 S
  256.     update()
    ' J  ?/ _& l7 w
  257.   end)
    ! `( N( w( i& d
  258.   .setNegativeButton("取消", nil)
    3 |5 w' X7 W1 n' k
  259.   .show();
    , l  L9 ^! }! X9 L* {
  260. end
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2022-7-1 22:14 , Processed in 0.066014 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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