import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.os.Environment;
import android.os.StatFs;

/**
 * Created by d on 2016/11/10.
 * Method:
 * getSDCardPath()
 * getSDCardTotal() 总容量
 * getSDCardFree() 可用容量
 * createSDDirection()   创建目录
 *deleteSDDirection  删除目录
 * isFileExist 文件是否存在
 * deleteSDFile  删除文件
 * renameSDFile 修改文件或目录
 * copySDFileTo 拷贝单个文件
 * copySDFilesTo 拷贝所有
 * moveSDFileTo 移动单个
 * moveSDFilesTo 移动多个
 * creatDataDirection 建立私有目录
 * deleteDataFile 删除私有文件
 * deleteDataDir 删除私有目录
 * renameDataFile 修改私有文件名
 * copyDataFileTo 私有目录下负责
 * moveDataFileTo 移动私有文件
 * moveDataFilesTo移动私有目录下所有文件
 * deleteFile 删除文件
 * deleteDirection 删除目录
 * copyFileTo 拷贝
 * copyFilesTo
 * moveFileTo 移动
 * moveFilesTo
 *
 */

public class ClassFileHelper {
    private Context mContext;
    private String SDPATH;
    private String FILESPATH;

    public ClassFileHelper(Context context){
        this.mContext = context;
        SDPATH = Environment.getExternalStorageDirectory().getPath() + "//";
        FILESPATH = this.mContext.getFilesDir().getPath() + "//";
    }

    //表示SDCard存在并且可以读写
    public boolean isSDCardState(){
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            return true;
        }else{
            return false;
        }
    }

    /**获取SDCard文件路径*/
    public String getSDCardPath(){
        if(isSDCardState()){//如果SDCard存在并且可以读写
            SDPATH = Environment.getExternalStorageDirectory().getPath();
            return SDPATH;
        }else{
            return null;
        }
    }

    /**获取SDCard 总容量大小(MB)*/
    public long getSDCardTotal(){
        if(null != getSDCardPath()&&getSDCardPath().equals("")){
            StatFs statfs = new StatFs(getSDCardPath());
            //获取SDCard的Block总数
            long totalBlocks = statfs.getBlockCount();
            //获取每个block的大小
            long blockSize = statfs.getBlockSize();
            //计算SDCard 总容量大小MB
            long SDtotalSize = totalBlocks*blockSize/1024/1024;
            return SDtotalSize;
        }else{
            return 0;
        }
    }

    /**获取SDCard 可用容量大小(MB)*/
    public long getSDCardFree(){
        if(null != getSDCardPath()&&getSDCardPath().equals("")){
            StatFs statfs = new StatFs(getSDCardPath());
            //获取SDCard的Block可用数
            long availaBlocks = statfs.getAvailableBlocks();
            //获取每个block的大小
            long blockSize = statfs.getBlockSize();
            //计算SDCard 可用容量大小MB
            long SDFreeSize = availaBlocks*blockSize/1024/1024;
            return SDFreeSize;
        }else{
            return 0;
        }
    }

    /**
     * 在SD卡上创建目录
     *
     * @param dirName
     *            要创建的目录名
     * @return 创建得到的目录
     */
    public File createSDDirection(String dirName) {
        File dir = new File(SDPATH + dirName);
        dir.mkdir();
        return dir;
    }

    /**
     * 删除SD卡上的目录
     *
     * @param dirName
     */
    public boolean deleteSDDirection(String dirName) {
        File dir = new File(SDPATH + dirName);
        return deleteDirection(dir);
    }


    /**
     * 判断文件是否已经存在
     *
     * @param fileName
     *         要检查的文件名
     * @return boolean, true表示存在,false表示不存在
     */
    public boolean isFileExist(String fileName) {
        File file = new File(SDPATH + fileName);
        return file.exists();
    }

    /**
     * 删除SD卡上的文件
     *
     * @param fileName
     */
    public boolean deleteSDFile(String fileName) {
        File file = new File(SDPATH + fileName);
        if (file == null || !file.exists() || file.isDirectory())
            return false;
        file.delete();
        return true;
    }


    /**
     * 修改SD卡上的文件或目录名
     *
     * @param fileName
     */
    public boolean renameSDFile(String oldfileName, String newFileName) {
        File oleFile = new File(SDPATH + oldfileName);
        File newFile = new File(SDPATH + newFileName);
        return oleFile.renameTo(newFile);
    }


    /**
     * 拷贝SD卡上的单个文件
     *
     * @param path
     * @throws IOException
     */

    public boolean copySDFileTo(String srcFileName, String destFileName) throws IOException {
        File srcFile = new File(SDPATH + srcFileName);
        File destFile = new File(SDPATH + destFileName);
        return copyFileTo(srcFile, destFile);
    }



    /**
     * 拷贝SD卡上指定目录的所有文件
     *
     * @param srcDirName
     * @param destDirName
     * @return
     * @throws IOException
     */
    public boolean copySDFilesTo(String srcDirName, String destDirName) throws IOException {
        File srcDir = new File(SDPATH + srcDirName);
        File destDir = new File(SDPATH + destDirName);
        return copyFilesTo(srcDir, destDir);
    }



    /**
     * 移动SD卡上的单个文件
     *
     * @param srcFileName
     * @param destFileName
     * @return
     * @throws IOException
     */

    public boolean moveSDFileTo(String srcFileName, String destFileName) throws IOException {
        File srcFile = new File(SDPATH + srcFileName);
        File destFile = new File(SDPATH + destFileName);
        return moveFileTo(srcFile, destFile);
    }



    /**
     * 移动SD卡上的指定目录的所有文件
     *
     * @param srcDirName
     * @param destDirName
     * @return
     * @throws IOException
     */

    public boolean moveSDFilesTo(String srcDirName, String destDirName) throws IOException {
        File srcDir = new File(SDPATH + srcDirName);
        File destDir = new File(SDPATH + destDirName);
        return moveFilesTo(srcDir, destDir);
    }



    /**
     * 建立私有目录
     *
     * @param dirName
     * @return
     */
    public File creatDataDirection(String dirName) {
        File dir = new File(FILESPATH + dirName);
        dir.mkdir();
        return dir;
    }



    /**
     * 删除私有文件
     *
     * @param fileName
     * @return
     */
    public boolean deleteDataFile(String fileName) {
        File file = new File(FILESPATH + fileName);
        return deleteFile(file);
    }



    /**
     * 删除私有目录
     *
     * @param dirName
     * @return
     */
    public boolean deleteDataDir(String dirName) {
        File file = new File(FILESPATH + dirName);
        return deleteDirection(file);
    }



    /**
     * 更改私有文件名
     *
     * @param oldName
     * @param newName
     * @return
     */

    public boolean renameDataFile(String oldName, String newName) {
        File oldFile = new File(FILESPATH + oldName);
        File newFile = new File(FILESPATH + newName);
        return oldFile.renameTo(newFile);
    }



    /**
     * 在私有目录下进行文件复制
     *
     * @param srcFileName
     *            : 包含路径及文件名
     * @param destFileName
     * @return
     * @throws IOException
     */

    public boolean copyDataFileTo(String srcFileName, String destFileName) throws IOException {
        File srcFile = new File(FILESPATH + srcFileName);
        File destFile = new File(FILESPATH + destFileName);
        return copyFileTo(srcFile, destFile);
    }



    /**
     * 复制私有目录里指定目录的所有文件
     *
     * @param srcDirName
     * @param destDirName
     * @return
     * @throws IOException
     */

    public boolean copyDataFilesTo(String srcDirName, String destDirName)

            throws IOException {
        File srcDir = new File(FILESPATH + srcDirName);
        File destDir = new File(FILESPATH + destDirName);
        return copyFilesTo(srcDir, destDir);
    }



    /**
     * 移动私有目录下的单个文件
     *
     * @param srcFileName
     * @param destFileName
     * @return
     * @throws IOException
     */

    public boolean moveDataFileTo(String srcFileName, String destFileName)

            throws IOException {
        File srcFile = new File(FILESPATH + srcFileName);
        File destFile = new File(FILESPATH + destFileName);
        return moveFileTo(srcFile, destFile);
    }



    /**
     * 移动私有目录下的指定目录下的所有文件
     *
     * @param srcDirName
     * @param destDirName
     * @return
     * @throws IOException
     */

    public boolean moveDataFilesTo(String srcDirName, String destDirName)

            throws IOException {
        File srcDir = new File(FILESPATH + srcDirName);
        File destDir = new File(FILESPATH + destDirName);
        return moveFilesTo(srcDir, destDir);
    }


    /**
     * 删除一个文件
     *
     * @param file
     * @return
     */

    public boolean deleteFile(File file) {
        if (file.isDirectory())
            return false;
        return file.delete();
    }

    /**
     * 删除一个目录(可以是非空目录)
     *
     * @param dir
     */

    public boolean deleteDirection(File dir) {
        if (dir == null || !dir.exists() || dir.isFile()) {
            return false;
        }
        for (File file : dir.listFiles()) {
            if (file.isFile()) {
                file.delete();
            } else if (file.isDirectory()) {
                deleteDirection(file);// 递归
            }
        }
        dir.delete();
        return true;
    }

    /**
     * 拷贝一个文件,srcFile源文件,destFile目标文件
     *
     * @param path
     * @throws IOException
     */

    public boolean copyFileTo(File srcFile, File destFile) throws IOException {

        if (srcFile.isDirectory() || destFile.isDirectory())
            return false;// 判断是否是文件
        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);
        int readLen = 0;
        byte[] buf = new byte[1024];
        while ((readLen = fis.read(buf)) != -1) {
            fos.write(buf, 0, readLen);
        }
        fos.flush();
        fos.close();
        fis.close();
        return true;
    }

    /**
     * 拷贝目录下的所有文件到指定目录
     *
     * @param srcDir
     * @param destDir
     * @return
     * @throws IOException
     */

    public boolean copyFilesTo(File srcDir, File destDir) throws IOException {

        if (!srcDir.isDirectory() || !destDir.isDirectory())
            return false;// 判断是否是目录
        if (!destDir.exists())
            return false;// 判断目标目录是否存在
        File[] srcFiles = srcDir.listFiles();
        for (int i = 0; i < srcFiles.length; i++) {
            if (srcFiles[i].isFile()) {
                // 获得目标文件
                File destFile = new File(destDir.getPath() + "//"
                        + srcFiles[i].getName());
                copyFileTo(srcFiles[i], destFile);
            } else if (srcFiles[i].isDirectory()) {
                File theDestDir = new File(destDir.getPath() + "//"
                        + srcFiles[i].getName());
                copyFilesTo(srcFiles[i], theDestDir);
            }
        }
        return true;
    }

    /**
     * 移动一个文件
     *
     * @param srcFile
     * @param destFile
     * @return
     * @throws IOException
     */

    public boolean moveFileTo(File srcFile, File destFile) throws IOException {

        boolean is_copy = copyFileTo(srcFile, destFile);

        if (!is_copy)
            return false;
        deleteFile(srcFile);
        return true;
    }

    /**
     * 移动目录下的所有文件到指定目录
     *
     * @param srcDir
     * @param destDir
     * @return
     * @throws IOException
     */

    public boolean moveFilesTo(File srcDir, File destDir) throws IOException {
        if (!srcDir.isDirectory() || !destDir.isDirectory()) {
            return false;
        }

        File[] srcDirFiles = srcDir.listFiles();
        for (int i = 0; i < srcDirFiles.length; i++) {
            if (srcDirFiles[i].isFile()) {
                File oneDestFile = new File(destDir.getPath() + "//"
                        + srcDirFiles[i].getName());
                moveFileTo(srcDirFiles[i], oneDestFile);
                deleteFile(srcDirFiles[i]);
            } else if (srcDirFiles[i].isDirectory()) {
                File oneDestFile = new File(destDir.getPath() + "//"
                        + srcDirFiles[i].getName());
                moveFilesTo(srcDirFiles[i], oneDestFile);
                deleteDirection(srcDirFiles[i]);
            }
        }
        return true;
    }
}