版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、http:/ Looper 实例,由于当前线程是 UI 线程也可以通过 Looper.getMainLooper()得到messageHandler=newMessageHandler(Looper.myLooper();if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)rootDir=Environment.getExternalStorageDirectory();elserootDir=Environment.getRootDirectory();loadFiles(rootDir);自定义
2、 HandlerclassMessageHandlerextendsHandlerpublicMessageHandler(Looperlooper)super(looper);OverridepublicvoidhandleMessage(Messagemsg)loadFiles(newFile(currentDir.getText().toString();OverridepublicbooleanonCreateOptionsMenu(Menumenu)MenuInflaterinflater=getMenuInflater();inflater.inflate(R.menu.menu,
3、menu);returntrue;OverridepublicbooleanonOptionsItemSelected(MenuItemitem)if(item.getItemId()=R.id.newFile)LayoutInflaterfactory=LayoutInflater.from(MainActivity.this);finalViewview=factory.inflate(R.layout.rename,null);AlertDialogd=newAlertDialog.Builder(MainActivity.this).setCancelable(true).setMes
4、sage(文件夹名).setView(view).setPositiveButton(确定,newDialogInterface.OnClickListener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)StringdirName=(EditText)view.findViewById(R.id.rename).getText().toString();StringnewFile=currentDir.getText().toString()+/+dirName;if(newFile(newFile).exists()T
5、oast.makeText(MainActivity.this,”文件夹已存在”,Toast.LENGTH_LONG).show();return;Filef=newFile(currentDir.getText().toString(),dirName);f.mkdir();).create();d.show();elseif(item.getltemld()=R.id.about)Dialogd=newAlertDialog.Builder(MainActivity.this),setTitle(.setPositiveButtonf确定,null).create();d.show();e
6、lseif(item.getltemld()=R.id.exit)MainActivity.this.finish();)returntrue;)/*加载当前文件夹列表*/publicvoidloadFiles(Filedir)ListMapString,Objectlist=newArrayListMapString,Object();if(dir!=null)/处理上级目录if(!dir.getAbsolutePath().equals(rootDir.getAbsolutePath()Mapmap=newHashMap();文件浏览器 1.Obeta)setMessage(本程序由劲松
7、Alex 制作)map.put(file,dir.getParentFile();map.put(name,上一级目录);map.put(img,R.drawable.folder);list.add(map);currentDir.setText(dir.getAbsolutePath();Filefiles=dir.listFiles();sortFiles(files);if(files!=null)for(Filef:files)MapString,Objectmap=newHashMap();map.put(file,f);map.put(name,f.getName();map.p
8、ut(img,f.isDirectory()?R.drawable.folder:(f.getName().toLowerCase().endsWith(.zip)?R.drawable.zip:R.drawable.text);list.add(map);elseToast.makeText(this,目录不正确,请输入正确的目录!,Toast.LENGTH_LONG).show();ListAdapteradapter=newSimpleAdapter(this,list,R.layout.item,newStringname,img,newintR.,R.id.icon);
9、/listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);listView.setAdapter(adapter);)/* 排序文件列表* */privatevoidsortFiles(Filefiles)Arrays.sort(files,newComparator()publicintcompare(Filefilel,Filefile2)if(filel.isDirectoryO&file2.isDirectory()return1;if(file2.isDirectoryO)return1;return-1;);)/* 打开文
10、件* paramfile* /privatevoidopenFile(Filefile)Intentintent=newlntent();intent.addFlags(lntent.FLAG_ACTIVITY_NEW_TASK);/设置 intent 的 Action 属性intent.setAction(lntent.ACTION_VIEW);/获取文件 file 的 MIME 类型Stringtype=getMIMEType(file);/设置 intent 的 data 和 Type 属性。intent.setDataAndType(Uri.fromFile(file),type);/
11、跳转startActivity(intent);)/* 根据文件后缀名获得对应的 MIME 类型。* paramfile* /privateStringgetMIMEType(Filefile)Stringtype=*/*;StringfName=file.getName();/获取后缀名前的分隔符在 fName 中的位置。intdotindex=fName.lastlndexOf(.);if(dotindex0)returntype;)/*获取文件的后缀名*/Stringend=fName.substring(dotlndex,fName.length().toLowerCase();if(
12、end=)returntype;/在 MIME 和文件类型的匹配表中找到对应的 MIME 类型。for(inti=0;iMIME_MapTable.length;i+)if(end.equals(MIME_MapTableiO)type=MIME_MapTablei1;)returntype;)OverridepublicvoidonClick(Viewv)if(v.getldQ=R.id.btnC)rootDir=Environment.getRootDirectory();loadFiles(rootDir);elseif(v.getId()=R.id.btnE)if(Environmen
13、t.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)rootDir=Environment.getExternalStorageDirectory();loadFiles(rootDir);OverridepublicvoidonItemClick(AdapterViewparent,Viewview,intposition,longid)MapString,Objectmap=(MapString,Object)parent.getItemAtPosition(position);finalFilefile=(File)m
14、ap.get(file);if(file.isDirectory()tryloadFiles(file);catch(Exceptione)Toast.makeText(this,权限不足,Toast.LENGTH_SHORT).show();elseopenFile(file);OverridepublicbooleanonItemLongClick(AdapterViewparent,Viewview,intposition,longid)Mapmap=(Map)parent.getItemAtPosition(position);finalFilefile=(File)map.get(f
15、ile);AlertDialogdialog=newAlertDialog.Builder(MainActivity.this).setTitle(操作).setItems(newString复制,剪切,粘贴,发送,重命名,删除,属性),newDialogInterface.OnClickListener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)switch(which)case0:copyPath=newFile(file.getAbsolutePath();flag=copy;break;case 1:copyPa
16、th=newFile(file.getAbsolutePath();flag=cut;break;case 2:finalStringstartPath=copyPath.getAbsolutePath();finalStringdesPath=currentDir.getText().toString()+/+copyPath.getName();Filefiles=newFile(currentDir.getText().toString().listFiles();for(Filefile:files)if(copyPath.getName().equals(file.getName()
17、Toast.makeText(MainActivity.this,此文件/文件夹已存在”,Toast.LENGTH_SHORT).show();return;)intlength=(int)(getLength(copyPath)/(1024);progressDialog=newProgressDialog(MainActivity.this);progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.setMessage(正在复制);progressDialog.setMax(length
18、);progressDialog.setProgress(0);progressDialog.setCancelable(false);progressDialog.show();newThread()publicvoidrun()copy(startPath,desPath);通过 Message 对象向原线程传递信息Messagemessage=Message.obtain();messageHandler.sendMessage(message);progressDialog.dismiss();/如果为剪切则删除对应文件/文件夹if(cut.equals(flag)if(copyPat
19、h.isFile()copyPath.delete();elseListdelDirs=delete(copyPath);for(inti=delDirs.size()-1;i=0;i-)delDirs.get(i).delete();.start();break;case 3:break;LayoutInflaterfactory=Layoutlnflater.from(MainActivity.this);finalViewview=factory.inflate(R.layout.rename,null);(EditText)view.findViewById(R.id.rename).
20、setText(file.getName();AlertDialogd=newAlertDialog.Builder(MainActivity.this).setCancelable(true).setMessage(新文件名).setView(view).setPositiveButton(确定,newDialogInterface.OnClickListener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)StringnewName=(EditText)view.findViewById(R.id.rename).ge
21、tText().toString();StringnewFile=currentDir.getText().toString()+/+newName;if(newFile(newFile).exists()Toast.makeText(MainActivity.this,文件名重复”,Toast.LENGTH_LONG).show();return;file.renameTo(newFile(newFile);).create();d.show();loadFiles(newFile(currentDir.getText().toString();break;AlertDialogad=new
22、AlertDialog.Builder(MainActivity.this).setMessage(确实要删除+file.getName()+吗?)setCancelable(true).setPositiveButton(确定,newDialogInterface.OnClickListener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)if(file.isFile()file.delete();elseListdelDirs=delete(file);for(inti=delDirs.size()-1;i=0;i-)
23、delDirs.get(i).delete();loadFiles(newFile(currentDir.getText().toString();).create();ad.show();break;default:break;Toast.makeText(MainActivity.this,+which,Toast.LENGTH_LONG).show();).create();dialog.show();/* Intentdata=newlntent();data.putExtra(path,* file.getAbsolutePath();this.setResult(RESULT_OK
24、,data);* this.finish();* /returntrue;)/*返回删除文件后的空文件夹列表*/publicListdelete(FiledelFile)if(delFile.isFile()delFile.delete();elseif(delFile.isDirectoryO)fileList.add(delFile);Filefiles=delFile.listFiles();for(Filefile:files)delete(file);returnfileList;)/*获取文件/文件夹大小*/privatelonggetLength(Filefile)if(file
25、.isDirectoryO)Filefiles=file.listFiles();for(Filefile2:files)totaLength=totaLength+getLength(file2);)elsetotaLength=totaLength+file.length();)returntotaLength;)/*复制功能,startFilePath 为文件源路径,desFilePath 为目的路径publicbooleancopy(StringstartFilePath,StringdesFilePath)currentLen=0;totaLength=0;this.startFil
26、ePath=startFilePath;this.desFilePath=desFilePath;/判断是否返回成功的变量booleancopyFinished=false;FilestartFile=newFile(startFilePath);FiledesFile=newFile(desFilePath);/如果源文件是个文件if(startFile.isFile()copyFinished=this.copySingleFile(startFile,desFile);/如果源文件是个文件夹,就需要递归复制else/如果目标文件夹是源文件夹的一个子目录的情况,拒绝复制,因为会造成无限循环
27、if(desFilePath.startsWith(startFilePath)System.out.println(errorcopy);returnfalse;elsecopyFinished=this.copyFolder(startFile,desFile);)returncopyFinished;)/*复制单个文件,如果复制多个文件可以递归调用*/privatebooleancopySingleFile(FilestartSingleFile,FiledesSingleFile)booleanrightcopy=false;/从源文件中输入内存入 byte 中,在将 byte 写入目
28、标文件一FileinputstreamsingleFilelnputStream=null;DatalnputStreamsingleDatalnputStream=null;FileOutputStreamsingleFileOutputStream=null;DataOutputStreamsingleDataOutputStream=null;trysingleFilelnputStream=newFilelnputStream(startSingleFile);singleDataInputStream=newDataInputStream(newBufferedlnputStream
29、(singleFilelnputStream);singleFileOutputStream=newFileOutputStream(desSingleFile);singleDataOutputStream=newDataOutputStream(newBufferedOutputStream(singleFileOutputStream);byte 口 b=newbyte1024;intlen=-1;while(len=singleDataInputStream.read(b)!=-1)currentLen=currentLen+len;singleDataOutputStream.wri
30、te(b,0,len);progressDialog.setProgress(currentLen/(1024);/刷新缓冲区singleDataOutputStream.flush();catch(Exceptione)e.printStackTrace();finallytryif(singleDatalnputStream!=null)singleDatalnputStream.closeO;if(singleDataOutputStream!=null)singleDataOutputStream.closeO;catch(Exceptione)e.printStackTrace();
31、)/判断源文件和目标文件大小是否相同,如果相同证明复制成功if(startSingleFile.length()=desSingleFile.length()rightCopy=true;elserightCopy=false;returnrightCopy;)/*递归复制文件夹,因为文件夹下不止一个文件,里面可能有文件或文件夹,*paramstartFolder因此需要调用递归方法=需要复制的文件夹* paramdesFolder* =复制目的地的文件夹* return=true 表示成功,false 表示失败* /publicbooleancopyFolder(FilestartFolde
32、r,FiledesFolder)booleanrightcopy=false;rightCopy=this.recursionCopy(startFolder,desFolder);returnrightCopy;)/* 复制文件夹函数,此函数是个递归,会复制文件夹下的所有文件* paramrecFileFolder* =需要拷贝的文件夹或子文件夹* paramrecDesFolder* =拷贝的目的文件夹或子文件夹,* return=true 表示成功,false 表示失败*/privatebooleanrecursionCopy(FilerecFileFolder,FilerecDesFo
33、lder)FiledesFolder=recDesFolder;/因为目的文件夹或子文件夹不存在,需要创建 desFolder.mkdir();/此为需要拷贝的文件夹下的所有文件列表(其中有文件和文件夹)Filefiles=recFileFolder.listFiles();/如果是个空文件夹if(files.length=0)returntrue;/*将文件夹下所有文件放入 for 循环,如果是文件,那么调用 copySingleFile()拷贝文件,如果是文件夹,那么递归调用此函数*/for(FilethisFile:files)/如果此文件是个文件,那么直接调用单个文件复制命令复制文件
34、if(thisFile.isFile()/得到此文件的新位置地址StringdesContentFilePath=this.getSubFilePath(startFilePath,desFilePath,thisFile.getAbsolutePath();booleanrightCopy=this.copySingleFile(thisFile,newFile(desContentFilePath);/如果复制失败,就跳出循环停止复制if(!rightCopy)returnfalse;/如果是个文件夹else/* 此函数是为了得到目的文件夹的地址,如:源文件夹为:D:/yingzi/tex
35、t(其中 text 文件夹下有另一个文件夹* second:D:/yingzi/text/second)目标位置为:E:/aa/text* 那么此 second 文件夹在目标地址的位置就是 E:/aa/text/second* /StringdesContentFilePath=this.getSubFilePath(startFilePath,desFilePath,thisFile.getAbsolutePath();/递归的调用此函数,确保函数都被复制完全booleanrightCopy=recursionCopy(thisFile,newFile(desContentFilePath)
36、;if(!rightCopy)returnfalse;*D:/yingzi/text/second)目标位置为:E:/aa/text 那么此 second 文件夹在目标地址的位置就是* E:/aa/text/second 此方法中 startFolderPath=D:/yingzi/text(源文件夹);* desFolderPath=E:/aa/text(目标位置);currentFilePath=* D:/yingzi/text/second(需要复制的子文件夹)返回值为:E:/aa/text/second*/privateStringgetSubFilePath(StringstartF
37、olderPath,StringdesFolderPath,StringcurrentFilePath)StringcurrentDesFilePath=null;inti=startFolderPath.length();/intj=desFolderPath.lastIndexOf(/);/StringsubDirPath=startFolderPath.substring(0,i);/StringsubDesPath=desFolderPath.substring(0,j);currentDesFilePath=desFolderPath+/+currentFilePath.substr
38、ing(i+1);/*)returntrue;此函数是为了得到目的文件夹的地址,如:源文件夹为:D:/yingzi/text(其中 text 文件夹下有另一个文件夹second:returncurrentDesFilePath;packagecom.mime;publicclassMIMEpublicstaticfinalStringMIME_MapTable=后缀名,MIME 类型.3gp,video/3gpp,.apk,application/vnd.android.package-archive,.asf,video/x-ms-asf,.avi,video/x-msvideo,.bin,application/octet-stream,.bmp,image/bmp,.c,text/plain,.class,application/octet-stream,.conf,text/plain,.cpp,text/plain,.doc,application/msword,.docx,application/vnd.openxmlf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学数学二年级下册口算练习100题-二年级数学口算练题
- 急诊医疗服务规范制度
- 13.1.2线段的垂直平分线性质(第二课时)
- 2024年西安客运驾驶员考试选择题及答案解析
- 算法设计与分析 课件 1.2.1-算法分析准则 - 正确性
- 2024年杭州客运考试应用能力试题及答案详解
- 2024年广西客车驾驶员从业资格证考试题库
- 2024年山西c1客运资格证模拟考试题下载什么软件
- 2024年四川客运从业资格证考试技巧口诀
- 2024年长沙客运从业资格证试题答案
- 汽车文化知识考试参考题库400题(含答案)
- WDZANYJY23低压电力电缆技术规格书
- 《水循环》-完整版课件
- 抗高血压药物基因检测课件
- 西游记 品味经典名著导读PPT
- 金坛区苏科版四年级心理健康教育第1课《我的兴趣爱好》课件(定稿)
- 心肌缺血和心肌梗死的心电图表现讲义课件
- 小学生性教育调查问卷
- 学历案的编写课件
- 旅游行政管理第二章旅游行政管理体制课件
- 卫生院关于召开基本公共卫生服务项目培训会的通知
评论
0/150
提交评论