Android File Checksum verifyChecksum(String path)

Here you can find the source of verifyChecksum(String path)

Description

Computes the checksum of a given directory tree and verifies that it matches the checksum stored in a file at the root the that directory

License

Apache License

Exception

Parameter Description

Declaration

public static boolean verifyChecksum(String path) throws IOException 

Method Source Code

/*// w  w w  . j  ava2  s  . c o m
Copyright 2008 Flaptor (flaptor.com) 

Licensed under the Apache License, Version 2.0 (the "License"); 
you may not use this file except in compliance with the License. 
You may obtain a copy of the License at 

    http://www.apache.org/licenses/LICENSE-2.0 

Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an "AS IS" BASIS, 
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
See the License for the specific language governing permissions and 
limitations under the License.
 */

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
import org.apache.log4j.Logger;

public class Main{
    static final String CHECKSUM_FILENAME = "checksum";
    /**
     * Computes the checksum of a given directory tree and verifies that it
     * matches the checksum stored in a file at the root the that directory
     * @throws java.io.IOException, java.io.FileNotFoundException
     * @todo deserialize properly @link #createChecksum()
     */
    public static boolean verifyChecksum(String path) throws IOException {
        //        boolean eq = false;
        long checksum_long = computeChecksum(path);
        byte[] checksum1 = String.valueOf(checksum_long).getBytes();
        byte[] checksum2 = new byte[checksum1.length];
        File f = new File(getDir(path), CHECKSUM_FILENAME);
        if (!f.exists()) {
            throw new FileNotFoundException(
                    "FileUtil.verifyChecksum: Missing checksum file in "
                            + path);
        }
        FileInputStream is = null;
        try {
            is = new FileInputStream(f);
            //XXX TODO: see comment about serialization in createChecksum
            is.read(checksum2);
            return java.util.Arrays.equals(checksum1, checksum2);
        } finally {
            Execute.close(is);
        }
    }
    /** 
     * Returns the checksum of a given directory tree. 
     * @throws java.io.IOException
     */
    public static long computeChecksum(String path) throws IOException {
        String dir = getDir(path);
        Checksum checksum = new CRC32();
        checksumDir(checksum, dir);
        return checksum.getValue();
    }
    /** 
     * Returns the absolute path of the given directory. 
     * @throws java.io.IOException
     * @todo see the method's body
     */
    public static String getDir(String path) throws IOException {
        File f = null;
        if (path.startsWith(Character.toString(File.separatorChar))) {
            f = new File(path);
        } else {//XXX TODO: is this necessary?
            f = new File(".", path);
        }
        return f.getCanonicalPath();
    }
    /**
     * Recursively computes the checksum of a given directory tree and adds it
     * to the provided Checksum object.
     * @throws java.io.FileNotFoundException, java.io.IOException
     */
    private static void checksumDir(Checksum chk, String path)
            throws IOException {
        File dir = new File(path);
        if (!dir.exists()) {
            throw new FileNotFoundException(
                    "FileUtil.checksumDir: The directory " + path
                            + " does not exist");
        }
        if (dir.isDirectory()) {
            String[] names = dir.list();
            // Needed because list() method may sort different the files
            // depending on implementation, and CRC32 is non-commutative.
            Arrays.sort(names, String.CASE_INSENSITIVE_ORDER);
            for (int i = 0; i < names.length; i++) {
                if (!names[i].endsWith(CHECKSUM_FILENAME)) {
                    String filespec = path + File.separatorChar + names[i];
                    File file = new File(filespec);
                    if (file.isDirectory()) {
                        checksumDir(chk, filespec);
                    } else {
                        checksumFile(chk, filespec);
                    }
                }
            }
        }
    }
    /**
     * Computes the checksum of a given file and adds it to the provided
     * Checksum object.
     * 
     * @param chk the Checksum object.
     * @param fname the name of the file to check it's checksum.
     * @throws java.io.FileNotFoundException, java.io.IOException
     */
    private static void checksumFile(final Checksum chk, final String fname)
            throws IOException {
        BufferedInputStream bis = null;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(fname);
            bis = new BufferedInputStream(fis);
            int len = 0;
            byte[] bytes = new byte[8192];
            while ((len = bis.read(bytes)) >= 0) {
                chk.update(bytes, 0, len);
            }
        } finally {
            Execute.close(bis);
            Execute.close(fis);
        }
    }
}

Related

  1. checksumFile(final Checksum chk, final String fname)
  2. computeChecksum(String path)
  3. getChecksum(String filePath)
  4. checkSum(File f)