丽-pc

导航

 

package com.example.administrator.filemanager.utils;

import com.example.administrator.filemanager.model.FileInfo;

import java.io.File;
import java.util.ArrayList;
/**
 * 文件管理类<br>
 * 主要完成文件大小的读取,分类以及删除
 *
 */

public class FileManager {

    /** 内置存储卡目录(可能为null) */
    public static File inSdcardDir = null;
    /** 外置存储卡目录(可能为null) */
    public static File outSdcardDir = null;

    static {
        // 如果有手机内置sdcard卡路径,进行内置Fiel实例化(防止File file = new File(null))
        if (MemoryManager.getPhoneInSDCardPath() != null) {
            inSdcardDir = null;
            inSdcardDir = new File(MemoryManager.getPhoneInSDCardPath());
        }
        // 如果有手机外置sdcard卡路径,进行外置Fiel实例化(防止File file = new File(null))
        if (MemoryManager.getPhoneOutSDCardPath() != null) {
            outSdcardDir = null;
            outSdcardDir = new File(MemoryManager.getPhoneOutSDCardPath());
        }
    }

    // 单例(单态)--------------------------------------------------------------------------------------
    private FileManager() {
    }

    private static FileManager fileManager = new FileManager();
    /**单例模式*/
    public static FileManager getFileManager() {
        return fileManager;
    }

    /**--------------------------------中止搜索的控制----------------------------------------------------**/

    /** 是否停止搜索 */
    private boolean isStopSearch = false;
    /**
     * {@link #isStopSearch}
     * @return
     */
    public boolean isStopSearch() {
        return isStopSearch;
    }
    /**
     * {@link #isStopSearch}
     * @return
     */
    public void setStopSearch(boolean isStopSearch) {
        this.isStopSearch = isStopSearch;
    }

/**------------------------------文件搜索-----------------------------------------**/
    /** 任意文件(非目录)集合 */
    private ArrayList<FileInfo> anyFileList = new ArrayList<FileInfo>();
    private long anyFileSize; // 任意文件总大小(在搜索过程中,实时迭加,计算总大小)
    /** 文档文件集合 */
    private ArrayList<FileInfo> txtFileList = new ArrayList<FileInfo>();
    private long txtFileSize; // 文档文件总大小(同上)
    /** 视频文件集合 */
    private ArrayList<FileInfo> videoFileList = new ArrayList<FileInfo>();
    private long videoFileSize; // 视频文件总大小(同上)
    /** 音乐文件集合 */
    private ArrayList<FileInfo> audioFileList = new ArrayList<FileInfo>();
    private long audioFileSize; // 音乐文件总大小(同上)
    /** 图像文件集合 */
    private ArrayList<FileInfo> imageFileList = new ArrayList<FileInfo>();
    private long imageFileSize; // 图像文件总大小(同上)
    /** ZIP文件集合 */
    private ArrayList<FileInfo> zipFileList = new ArrayList<FileInfo>();
    private long zipFileSize; // ZIP文件总大小(同上)
    /** APK文件集合 */
    private ArrayList<FileInfo> apkFileList = new ArrayList<FileInfo>();
    private long apkFileSize; // APK文件总大小(同上)

    /**-------------初始化相关变量(在每次重新开始搜索前,如searchSDCardFile())------------------------------**/
    private void initData() {
        isStopSearch = false;
        anyFileSize = 0;
        txtFileSize = 0;
        videoFileSize = 0;
        audioFileSize = 0;
        imageFileSize = 0;
        zipFileSize = 0;
        apkFileSize = 0;
        anyFileList.clear();
        txtFileList.clear();
        videoFileList.clear();
        audioFileList.clear();
        imageFileList.clear();
        zipFileList.clear();
        apkFileList.clear();
    }

    /** 搜索存储卡目录下的所有文件,结果实时保存在 {@link #anyFileList}内 */
    public void searchSDCardFile() {
        if (anyFileList == null || anyFileList.size() <= 0) {
            initData();
            searchFile(inSdcardDir, false); // 传入false标记, 不让运算反溃结束
            searchFile(outSdcardDir, true); // 传入true标记, 让运算反溃结束
        } else {
            // 直接回调非异常结束
            callbackSearchFileListenerEnd(false);
        }
    }

    /** (未用到)搜索指定目录下的所有文件,结果实时保存在 {@link #anyFileList}内 */
    public void searchFile(File file) {
        initData();
        searchFile(file, true);
    }

    /** (未用到)搜索内置存储卡目录下的所有文件,结果实时保存在 {@link #anyFileList}内 */
    public void searchINSDCardFile() {
        initData();
        searchFile(inSdcardDir, true);
    }

    /** (未用到)搜索外置存储卡目录下的所有文件,结果实时保存在 {@link #anyFileList}内 */
    public void searchOUTSDCardFile() {
        initData();
        searchFile(outSdcardDir, true);
    }

    /**
     * 递归搜索所有文件
     *
     * @param file

     *            为递归结束判断准备,每次调用方法栈内的flag值都不一样,第一次调用的结束才是真正结束(才会调用反馈结束方法)
     */
    private void searchFile(File file, boolean isFirstRunFlag) {
        // ----中止搜索------
        if (isStopSearch) {
            // 是首次运行的结束(搜索结束)
            if (isFirstRunFlag) {
                callbackSearchFileListenerEnd(true);// 回调接口end()方法,搜索结束(异常结束)
            }
            return;
        }
        // #1 排除"不正常"文件
        if (file == null || !file.canRead() || !file.exists()) {
            // 是首次运行的结束(搜索结束)
            if (isFirstRunFlag) {
                callbackSearchFileListenerEnd(true);// 回调接口end()方法,搜索结束(异常结束)
            }
            return;
        }
        // #2 如果是文件(非目录)
        if (!file.isDirectory()) {
            // 判断文件大小
            if (file.length() <= 0) {
                return;
            }
            //如果文件名称中没有“.”  未知文件类型
            if (file.getName().lastIndexOf('.') == -1) {
                return;
            }
            //获取图标以及文件类型
            String[] iconAndTypeNames = FileTypeUtil.getFileIconAndTypeName(file);
            final String iconName = iconAndTypeNames[0]; // 此文件使用什么图像(在Res中的图标文件名称)
            final String typeName = iconAndTypeNames[1]; // 此文件是属什么类型的
            // 添加到所有文件的集合
            FileInfo fileInfo = new FileInfo(file, iconName, typeName);
            anyFileList.add(fileInfo);
            // 迭加计算总文件大小
            anyFileSize += file.length();
            // 分类
            if (typeName.equals(FileTypeUtil.TYPE_APK)) {
                apkFileSize += file.length();
                apkFileList.add(fileInfo);
            } else if (typeName.equals(FileTypeUtil.TYPE_AUDIO)) {
                audioFileSize += file.length();
                audioFileList.add(fileInfo);
            } else if (typeName.equals(FileTypeUtil.TYPE_IMAGE)) {
                imageFileSize += file.length();
                imageFileList.add(fileInfo);
            } else if (typeName.equals(FileTypeUtil.TYPE_TXT)) {
                txtFileSize += file.length();
                txtFileList.add(fileInfo);
            } else if (typeName.equals(FileTypeUtil.TYPE_VIDEO)) {
                videoFileSize += file.length();
                videoFileList.add(fileInfo);
            } else if (typeName.equals(FileTypeUtil.TYPE_ZIP)) {
                zipFileSize += file.length();
                zipFileList.add(fileInfo);
            }
            // 回调接口searching方法(用作通知调用者数据更新了)
            callbackSearchFileListenerSearching(typeName);
            return;
        }
        // #3 如果是目录
        File[] files = file.listFiles();
        if (files == null || files.length <= 0) {
            return;
        }
        for (int i = 0; i < files.length; i++) {
            File tmpFile = files[i];
            searchFile(tmpFile, false);// 递归,以后的方法栈内的flag值都为false,表示不再是第一次的调用
        }
        // 是首次运行的结束(搜索结束)
        if (isFirstRunFlag) {
            callbackSearchFileListenerEnd(false);// 回调接口end()方法,搜索结束,完成,非异常结束
        }
    }

    /** 获取所有文件文件列表(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public ArrayList<FileInfo> getAnyFileList() {
        return anyFileList;
    }

    /** 获取文档文件列表(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public ArrayList<FileInfo> getTxtFileList() {
        return txtFileList;
    }

    /** 获取视频文件文件列表(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public ArrayList<FileInfo> getVideoFileList() {
        return videoFileList;
    }

    /** 获取音乐文件文件列表(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public ArrayList<FileInfo> getAudioFileList() {
        return audioFileList;
    }

    /** 获取图像文件文件列表(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public ArrayList<FileInfo> getImageFileList() {
        return imageFileList;
    }

    /** 获取APK文件列表(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public ArrayList<FileInfo> getApkFileList() {
        return apkFileList;
    }

    /** 获取zip文件列表(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public ArrayList<FileInfo> getZipFileList() {
        return zipFileList;
    }

    /** 获取APK文件当前总大小(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public long getApkFileSize() {
        return apkFileSize;
    }

    /** 获取zip文件当前总大小(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public long getZipFileSize() {
        return zipFileSize;
    }

    /** 获取任意所有文件当前总大小(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public long getAnyFileSize() {
        return anyFileSize;
    }

    /** 获取文本文件当前总大小(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public long getTxtFileSize() {
        return txtFileSize;
    }

    /** 获取视频文件当前总大小(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public long getVideoFileSize() {
        return videoFileSize;
    }

    /** 获取音频文件当前总大小(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public long getAudioFileSize() {
        return audioFileSize;
    }

    /** 获取图像文件当前总大小(搜索过程中{@link #searchSDCardFile()}实时在变化) */
    public long getImageFileSize() {
        return imageFileSize;
    }

    public void setAnyFileSize(long anyFileSize) {
        this.anyFileSize = anyFileSize;
        if (this.anyFileSize < 0) {
            this.anyFileSize = 0;
        }
    }

    public void setTxtFileSize(long txtFileSize) {
        this.txtFileSize = txtFileSize;
        if (this.txtFileSize < 0) {
            this.txtFileSize = 0;
        }
    }

    public void setVideoFileSize(long videoFileSize) {
        this.videoFileSize = videoFileSize;
        if (this.videoFileSize < 0) {
            this.videoFileSize = 0;
        }
    }

    public void setAudioFileSize(long audioFileSize) {
        this.audioFileSize = audioFileSize;
        if (this.audioFileSize < 0) {
            this.audioFileSize = 0;
        }
    }

    public void setImageFileSize(long imageFileSize) {
        this.imageFileSize = imageFileSize;
        if (this.imageFileSize < 0) {
            this.imageFileSize = 0;
        }
    }

    public void setZipFileSize(long zipFileSize) {
        this.zipFileSize = zipFileSize;
        if (this.zipFileSize < 0) {
            this.zipFileSize = 0;
        }
    }

    public void setApkFileSize(long apkFileSize) {
        this.apkFileSize = apkFileSize;
        if (this.apkFileSize < 0) {
            this.apkFileSize = 0;
        }
    }

    /**------------------搜索过程监听-------------------------------------**/
    private SearchFileListener listener; // 搜索过程监听

    /**
     * 搜索过程的实时监听{@link #setSearchFileListener(SearchFileListener listener)},
     * 用做搜索过程实时反溃文件信息
     */
    public interface SearchFileListener {
        /**
         * 当搜索过程中,每搜索到一个文件将调用
         *
         * @see ,想要获取当前数据集合及数据量可用getApkFileSize()和 getApkFileList()实时获取
         */
        void searching(String typeName);

        /** 当搜索结束时将调用 */
        void end(boolean isExceptionEnd);
    }
    /** 设置文件查找监听*/
    public void setSearchFileListener(SearchFileListener listener) {
        this.listener = listener;
    }

    /** 用来回调 SearchFileListener接口内方法 */
    private void callbackSearchFileListenerSearching(String typeName) {
        if (listener != null) {
            listener.searching(typeName);
        }
    }

    /** 用来回调 SearchFileListener接口内方法 */
    private void callbackSearchFileListenerEnd(boolean isExceptionEnd) {
        if (listener != null) {
            listener.end(isExceptionEnd);
        }
    }

    /** 取得文件或文件夹大小 */
    public static long getFileSize(File file) {
        long size = 0;
        if (!file.isDirectory()) { // 文件
            return file.length();
        }
        File files[] = file.listFiles(); // 文件夹(递归)
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                size = size + getFileSize(files[i]);
            } else {
                size = size + files[i].length();
            }
        }
        return size;
    }

    /** 删除文件 **/
    public void deleteFile(File f) {
        if (f.isDirectory()) {
            File[] files = f.listFiles();
            if (files != null && files.length > 0) {
                for (int i = 0; i < files.length; ++i) {
                    deleteFile(files[i]);
                }
            }
        }
        f.delete();
    }
}

posted on 2017-01-04 09:22  丽丽博客园  阅读(450)  评论(0编辑  收藏  举报