Как проверить, существует ли файл и имеет ли он тот же контент

У меня возникли проблемы с поиском способа узнать, существует ли файл, и если он существует, имеет ли он то же содержимое? Если да, то не скачивайте, иначе скачайте файл.

В моем коде мне нужно загрузить файл PDF перед его просмотром. У меня уже есть проверка, существует ли файл, но он проверяет только имя файла (в этом я не уверен). Проверяет ли метод exists() класса File только имя файла? Если это так, как я узнаю, что у него другой контент?

Вот мой код:

class DownloadFileTask extends AsyncTask<String, String, String> {
    private Context context;
    public ProgressDialog pDialog;
    private File pdfFile = new File(Environment
            .getExternalStorageDirectory().getPath()
            + "/SAMPLE/"
            + pdfFileName);

    public DownloadFileTask(Context context) {
        this.context = context;
    }

    /**
     * Before starting background thread Show Progress Bar Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        if (!pdfFile.exists()) {
            pDialog = new ProgressDialog(context);
            pDialog.setMessage(getString(R.string.loading));
            pDialog.setCancelable(false);
            pDialog.setIndeterminate(false);
            pDialog.setMax(100);
            pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pDialog.show();
        }
    }

    /**
     * Downloading file in background thread
     * */
    @Override
    protected String doInBackground(String... path) {
        int count;

        if (!pdfFile.exists()) {
            if (Utility.isNetworkAvailable(parentActivityContext)) {
                try {
                    String urlLastPath = Utility
                            .getLastPathFromUrl(path[0]);

                    String urlEncoded = URLEncoder.encode(urlLastPath,
                            "utf-8");

                    String urlDecoded = null;
                    String urlStr;
                    if (urlEncoded.contains(" ")) {
                        urlDecoded = urlEncoded.replaceAll(" ", "%20");
                        urlStr = SystemInfo.getResourceUrl() + "pdf/"
                                + urlDecoded;
                    } else if (urlEncoded.contains("+")) {
                        urlDecoded = urlEncoded.replaceAll(
                                Pattern.quote("+"), "%20");
                        urlStr = SystemInfo.getResourceUrl() + "pdf/"
                                + urlDecoded;
                    } else {
                        urlStr = SystemInfo.getResourceUrl() + "pdf/"
                                + urlEncoded;
                    }

                    URL url = new URL(urlStr);

                    URLConnection urlConnection = url.openConnection();
                    urlConnection.connect();
                    // getting file length
                    int lengthOfFile = urlConnection.getContentLength();

                    // input stream to read file - with 8k buffer
                    InputStream input = new BufferedInputStream(
                            url.openStream(), 8192);

                    // Output stream to write file
                    OutputStream output = new FileOutputStream(Environment
                            .getExternalStorageDirectory().getPath()
                            + "/'SAMPLE/" + pdfFileName);

                    byte data[] = new byte[1024];

                    long total = 0;

                    while ((count = input.read(data)) != -1) {
                        total += count;
                        // publishing the progress....
                        // After this onProgressUpdate will be called
                        publishProgress(""
                                + (int) ((total * 100) / lengthOfFile));

                        // writing data to file
                        output.write(data, 0, count);
                    }

                    // flushing output
                    output.flush();

                    // closing streams
                    output.close();
                    input.close();

                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("Error: ", e.getMessage());
                }
            } else {
                openDialog(getString(R.string.error),
                        getString(R.string.internet_connection_error));
            }
        }
        return null;
    }

    /**
     * Updating progress bar
     * */
    protected void onProgressUpdate(String... progress) {
        // setting progress percentage
        pDialog.setProgress(Integer.parseInt(progress[0]));
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    @Override
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after the file was downloaded
        if (null != pDialog && pDialog.isShowing()) {
            pDialog.dismiss();
        }

        /** PDF reader code */
        Intent intent = new Intent(parentActivityContext,
                MuPDFActivity.class);
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(Uri.fromFile(pdfFile));
        startActivity(intent);
    }
}

person Compaq LE2202x    schedule 12.03.2014    source источник
comment
Чтобы проверить равенство содержимого, вы можете проверить их Контрольные суммы MD5   -  person CodingIntrigue    schedule 12.03.2014
comment
Спасибо за ссылку, я только что прочитал о MD5 checksum и узнал, что это решение. Если бы это не был комментарий, я бы принял это как ответ.   -  person Compaq LE2202x    schedule 12.03.2014


Ответы (1)


Всегда полезно проверять MD5 checksum файла до и после его загрузки (и после размещения на /sdcard). Правильная реализация на стороне сервера гарантирует, что суммы MD5 для размещенных там файлов будут опубликованы. Проверка суммы MD5 загруженного файла гарантирует, что у вас есть полная, завершенная и неповрежденная версия файла.

В вашем случае вы можете сравнить MD5 checksum Файла_1 после загрузки и сохранения его в sd-card с MD5 checksum Файла_2 перед загрузкой.

person Ritesh Gune    schedule 12.03.2014
comment
Это было бы неплохо, но для этого потребуется добавить return в мой метод API. На данный момент на стороне приложения я проверю MD5 checksum на SD-карте с MD5 checksum нового файла. - person Compaq LE2202x; 12.03.2014