package com.yarin.android.FileManager; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.AlertDialog; import android.app.ListActivity; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnClickListener; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; public class FileManager extends ListActivity { private List<IconifiedText> directoryEntries = new ArrayList<IconifiedText>(); private File currentDirectory = new File("/"); private File myTmpFile = null; private int myTmpOpt = -1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); browseToRoot(); this.setSelection(0); } //����ļ�ϵͳ�ĸ�Ŀ¼ private void browseToRoot() { browseTo(new File("/")); } //������һ��Ŀ¼ private void upOneLevel() { if(this.currentDirectory.getParent() != null) this.browseTo(this.currentDirectory.getParentFile()); } //���ָ����Ŀ¼,������ļ�����д򿪲��� private void browseTo(final File file) { this.setTitle(file.getAbsolutePath()); if (file.isDirectory()) { this.currentDirectory = file; fill(file.listFiles()); } else { fileOptMenu(file); } } //��ָ���ļ� protected void openFile(File aFile) { Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); File file = new File(aFile.getAbsolutePath()); // ȡ���ļ��� String fileName = file.getName(); // ���ݲ�ͬ���ļ����������ļ� if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingImage))) { intent.setDataAndType(Uri.fromFile(file), "image/*"); } else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingAudio))) { intent.setDataAndType(Uri.fromFile(file), "audio/*"); } else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingVideo))) { intent.setDataAndType(Uri.fromFile(file), "video/*"); } startActivity(intent); } //����������Ϊ����ListActivity��Դ private void fill(File[] files) { //����б� this.directoryEntries.clear(); //���һ����ǰĿ¼��ѡ�� this.directoryEntries.add(new IconifiedText(getString(R.string.current_dir), getResources().getDrawable(R.drawable.folder))); //������Ǹ�Ŀ¼�������һ��Ŀ¼�� if (this.currentDirectory.getParent() != null) this.directoryEntries.add(new IconifiedText(getString(R.string.up_one_level), getResources().getDrawable(R.drawable.uponelevel))); Drawable currentIcon = null; for (File currentFile : files) { //�ж���һ���ļ��л���һ���ļ� if (currentFile.isDirectory()) { currentIcon = getResources().getDrawable(R.drawable.folder); } else { //ȡ���ļ��� String fileName = currentFile.getName(); //�����ļ������ж��ļ����ͣ����ò�ͬ��ͼ�� if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingImage))) { currentIcon = getResources().getDrawable(R.drawable.image); } else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingWebText))) { currentIcon = getResources().getDrawable(R.drawable.webtext); } else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingPackage))) { currentIcon = getResources().getDrawable(R.drawable.packed); } else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingAudio))) { currentIcon = getResources().getDrawable(R.drawable.audio); } else if (checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingVideo))) { currentIcon = getResources().getDrawable(R.drawable.video); } else { currentIcon = getResources().getDrawable(R.drawable.text); } } //ȷ��ֻ��ʾ�ļ���������ʾ·���磺/sdcard/111.txt��ֻ����ʾ111.txt int currentPathStringLenght = this.currentDirectory.getAbsolutePath().length(); this.directoryEntries.add(new IconifiedText(currentFile.getAbsolutePath().substring(currentPathStringLenght), currentIcon)); } Collections.sort(this.directoryEntries); IconifiedTextListAdapter itla = new IconifiedTextListAdapter(this); //�������õ�ListAdapter�� itla.setListItems(this.directoryEntries); //ΪListActivity���һ��ListAdapter this.setListAdapter(itla); } protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // ȡ��ѡ�е�һ����ļ��� String selectedFileString = this.directoryEntries.get(position).getText(); if (selectedFileString.equals(getString(R.string.current_dir))) { //���ѡ�е���ˢ�� this.browseTo(this.currentDirectory); } else if (selectedFileString.equals(getString(R.string.up_one_level))) { //������һ��Ŀ¼ this.upOneLevel(); } else { File clickedFile = null; clickedFile = new File(this.currentDirectory.getAbsolutePath()+ this.directoryEntries.get(position).getText()); if(clickedFile != null) this.browseTo(clickedFile); } } //ͨ���ļ����ж���ʲô���͵��ļ� private boolean checkEndsWithInStringArray(String checkItsEnd, String[] fileEndings) { for(String aEnd : fileEndings) { if(checkItsEnd.endsWith(aEnd)) return true; } return false; } public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, 0, 0, "�½�Ŀ¼").setIcon(R.drawable.addfolderr); menu.add(0, 1, 0, "ɾ��Ŀ¼").setIcon(R.drawable.delete); menu.add(0, 2, 0, "ճ���ļ�").setIcon(R.drawable.paste); menu.add(0, 3, 0, "��Ŀ¼").setIcon(R.drawable.goroot); menu.add(0, 4, 0, "��һ��").setIcon(R.drawable.uponelevel); return true; } public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch (item.getItemId()) { case 0: Mynew(); break; case 1: //ע�⣺ɾ��Ŀ¼�������������������ṩ�� //deleteFile��ɾ���ļ�����deleteFolder��ɾ������Ŀ¼�� MyDelete(); break; case 2: MyPaste(); break; case 3: this.browseToRoot(); break; case 4: this.upOneLevel(); break; } return false; } @Override public boolean onPrepareOptionsMenu(Menu menu) { return super.onPrepareOptionsMenu(menu); } //ճ������ public void MyPaste() { if ( myTmpFile == null ) { Builder builder = new Builder(FileManager.this); builder.setTitle("��ʾ"); builder.setMessage("û�и��ƻ���в���"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } else { if ( myTmpOpt == 0 )//���Ʋ��� { if(new File(GetCurDirectory()+"/"+myTmpFile.getName()).exists()) { Builder builder = new Builder(FileManager.this); builder.setTitle("ճ����ʾ"); builder.setMessage("��Ŀ¼����ͬ���ļ����Ƿ���Ҫ���ǣ�"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { copyFile(myTmpFile,new File(GetCurDirectory()+"/"+myTmpFile.getName())); browseTo(new File(GetCurDirectory())); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } else { copyFile(myTmpFile,new File(GetCurDirectory()+"/"+myTmpFile.getName())); browseTo(new File(GetCurDirectory())); } } else if(myTmpOpt == 1)//ճ������ { if(new File(GetCurDirectory()+"/"+myTmpFile.getName()).exists()) { Builder builder = new Builder(FileManager.this); builder.setTitle("ճ����ʾ"); builder.setMessage("��Ŀ¼����ͬ���ļ����Ƿ���Ҫ���ǣ�"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { moveFile(myTmpFile.getAbsolutePath(),GetCurDirectory()+"/"+myTmpFile.getName()); browseTo(new File(GetCurDirectory())); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } else { moveFile(myTmpFile.getAbsolutePath(),GetCurDirectory()+"/"+myTmpFile.getName()); browseTo(new File(GetCurDirectory())); } } } } //ɾ�������ļ��� public void MyDelete() { //ȡ�õ�ǰĿ¼ File tmp=new File(this.currentDirectory.getAbsolutePath()); //������һ��Ŀ¼ this.upOneLevel(); //ɾ��ȡ�õ�Ŀ¼ if ( deleteFolder(tmp) ) { Builder builder = new Builder(FileManager.this); builder.setTitle("��ʾ"); builder.setMessage("ɾ���ɹ�"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } else { Builder builder = new Builder(FileManager.this); builder.setTitle("��ʾ"); builder.setMessage("ɾ��ʧ��"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } this.browseTo(this.currentDirectory); } //�½��ļ��� public void Mynew() { final LayoutInflater factory = LayoutInflater.from(FileManager.this); final View dialogview = factory.inflate(R.layout.dialog, null); //����TextView ((TextView) dialogview.findViewById(R.id.TextView_PROM)).setText("�������½��ļ��е����ƣ�"); //����EditText ((EditText) dialogview.findViewById(R.id.EditText_PROM)).setText("�ļ�������..."); Builder builder = new Builder(FileManager.this); builder.setTitle("�½��ļ���"); builder.setView(dialogview); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { String value = ((EditText) dialogview.findViewById(R.id.EditText_PROM)).getText().toString(); if ( newFolder(value) ) { Builder builder = new Builder(FileManager.this); builder.setTitle("��ʾ"); builder.setMessage("�½��ļ��гɹ�"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //���ȷ����ť֮��,����ִ����ҳ�еIJ��� dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } else { Builder builder = new Builder(FileManager.this); builder.setTitle("��ʾ"); builder.setMessage("�½��ļ���ʧ��"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //���ȷ����ť֮��,����ִ����ҳ�еIJ��� dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { dialog.cancel(); } }); builder.show(); } //�½��ļ��� public boolean newFolder(String file) { File dirFile = new File(this.currentDirectory.getAbsolutePath()+"/"+file); try { if (!(dirFile.exists()) && !(dirFile.isDirectory())) { boolean creadok = dirFile.mkdirs(); if (creadok) { this.browseTo(this.currentDirectory); return true; } else { return false; } } } catch (Exception e) { e.printStackTrace(); System.out.println(e); return false; } return true; } //ɾ���ļ� public boolean deleteFile(File file) { boolean result = false; if (file != null) { try { File file2 = file; file2.delete(); result = true; } catch (Exception e) { e.printStackTrace(); result = false; } } return result; } //ɾ���ļ��� public boolean deleteFolder(File folder) { boolean result = false; try { String childs[] = folder.list(); if (childs == null || childs.length <= 0) { if (folder.delete()) { result = true; } } else { for (int i = 0; i < childs.length; i++) { String childName = childs[i]; String childPath = folder.getPath() + File.separator + childName; File filePath = new File(childPath); if (filePath.exists() && filePath.isFile()) { if (filePath.delete()) { result = true; } else { result = false; break; } } else if (filePath.exists() && filePath.isDirectory()) { if (deleteFolder(filePath)) { result = true; } else { result = false; break; } } } folder.delete(); } } catch (Exception e) { e.printStackTrace(); result = false; } return result; } //�����ļ��������򿪣��������Ȳ��� public void fileOptMenu(final File file) { OnClickListener listener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which == 0) { openFile(file); } else if (which == 1) { //�Զ���һ��������ĶԻ�����TextView��EditText���� final LayoutInflater factory = LayoutInflater.from(FileManager.this); final View dialogview = factory.inflate(R.layout.rename, null); //����TextView����ʾ��Ϣ ((TextView) dialogview.findViewById(R.id.TextView01)).setText("������"); //����EditText������ʼֵ ((EditText) dialogview.findViewById(R.id.EditText01)).setText(file.getName()); Builder builder = new Builder(FileManager.this); builder.setTitle("������"); builder.setView(dialogview); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //���ȷ��֮�� String value = GetCurDirectory()+"/"+((EditText) dialogview.findViewById(R.id.EditText01)).getText().toString(); if(new File(value).exists()) { Builder builder = new Builder(FileManager.this); builder.setTitle("������"); builder.setMessage("�ļ����ظ����Ƿ���Ҫ���ǣ�"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { String str2 = GetCurDirectory()+"/"+((EditText) dialogview.findViewById(R.id.EditText01)).getText().toString(); file.renameTo(new File(str2)); browseTo(new File(GetCurDirectory())); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } else { //������ file.renameTo(new File(value)); browseTo(new File(GetCurDirectory())); } } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { dialog.cancel(); } }); builder.show(); } else if ( which == 2 ) { Builder builder = new Builder(FileManager.this); builder.setTitle("ɾ���ļ�"); builder.setMessage("ȷ��ɾ��"+file.getName()+"��"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if ( deleteFile(file) ) { Builder builder = new Builder(FileManager.this); builder.setTitle("��ʾ�Ի���"); builder.setMessage("ɾ���ɹ�"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //���ȷ����ť֮�� dialog.cancel(); browseTo(new File(GetCurDirectory())); } }); builder.setCancelable(false); builder.create(); builder.show(); } else { Builder builder = new Builder(FileManager.this); builder.setTitle("��ʾ�Ի���"); builder.setMessage("ɾ��ʧ��"); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //���ȷ����ť֮�� dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); } else if ( which == 3 )//���� { //�������Ǹ��Ƶ��ļ�Ŀ¼ myTmpFile = file; //����������0��ʾ���Ʋ��� myTmpOpt = 0; } else if ( which == 4 )//���� { //�������Ǹ��Ƶ��ļ�Ŀ¼ myTmpFile = file; //����������0��ʾ���в��� myTmpOpt = 1; } } }; //��ʾ�����˵� String[] menu={"��","������","ɾ��","����","����"}; new AlertDialog.Builder(FileManager.this) .setTitle("��ѡ����Ҫ���еIJ���") .setItems(menu,listener) .show(); } //�õ���ǰĿ¼�ľ���·�� public String GetCurDirectory() { return this.currentDirectory.getAbsolutePath(); } //�ƶ��ļ� public void moveFile(String source, String destination) { new File(source).renameTo(new File(destination)); } //�����ļ� public void copyFile(File src, File target) { InputStream in = null; OutputStream out = null; BufferedInputStream bin = null; BufferedOutputStream bout = null; try { in = new FileInputStream(src); out = new FileOutputStream(target); bin = new BufferedInputStream(in); bout = new BufferedOutputStream(out); byte[] b = new byte[8192]; int len = bin.read(b); while (len != -1) { bout.write(b, 0, len); len = bin.read(b); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (bin != null) { bin.close(); } if (bout != null) { bout.close(); } } catch (IOException e) { e.printStackTrace(); } } } }