2011-10-19 20 views
11

私はサーバーからpdfをダウンロードしてsdcardに保存したいと思います。私は次のコードのようなものを試してみますが、ファイルがまだ存在していないので、MSGにファイルが存在するようにします。なぜそれはそうですか?ファイルが存在するかどうかチェックする方法と非同期タスクのsdcardに新しいファイルを作成しない場合

String pdf; 
String filenameWithExtension=""; 

protected void onCreate(Bundle savedInstanceState) { 

     Intent intent=getIntent(); 
     pdf=intent.getStringExtra("pdfurl"); 
     String PATH2 = Environment.getExternalStorageDirectory()+"/pictures"; 
     Log.v("log_tag initial path", "PATH: " + PATH2); 
     File file2 = new File(PATH2); 
     if(file2.exists()==true) 
     { 
     }else 
     { 
      Log.v("directory is created", "new dir"); 
      file2.mkdir(); 
     } 

     /**extracting the pdf filname from url**/ 
     int slashIndex = pdf.lastIndexOf('/'); 
     int dotIndex = pdf.lastIndexOf('.'); 
     filenameWithExtension=pdf.substring(slashIndex + 1); 

     DownloadFile downloadFile = new DownloadFile(filenameWithExtension); 
     downloadFile.execute(pdf); 
} 
private class DownloadFile extends AsyncTask<String, Integer, String>{ 

     String filename=""; 
     public DownloadFile(String _filename) { 
      this.filename=_filename; 

     } 
     String PATH = Environment.getExternalStorageDirectory()+"/pictures/"+filename; 
     File filecheck=new File(PATH); 

     @Override 
     protected String doInBackground(String... str) { 

      Log.v("name of file",this.filename); 
      if(filecheck.exists()){ 
       Log.v("in if condition", "file is alredy exist"); 

      }else{ 
       Log.v("in else condition","file not present...."); 
       try { 
        URL url = new URL(str[0]); 
        HttpURLConnection c = (HttpURLConnection)url.openConnection(); 
        c.setRequestMethod("GET"); 
        c.setDoOutput(true); 
        c.connect(); 
        // this will be useful so that you can show a typical 0-100% progress bar 
        int lenghtOfFile = c.getContentLength(); 

        // downlod the file 
        // InputStream input = new BufferedInputStream(url.openStream()); 
        //OutputStream output = new FileOutputStream("/sdcard/somewhere/nameofthefile.ext"); 
        String PATH = Environment.getExternalStorageDirectory()+ "/pictures/"; 
        Log.v("log_tag", "PATH: " + PATH); 
        File file = new File(PATH); 
        Boolean check=filecheck.createNewFile(); 
        Log.v("check file creation..::", check.toString()); 
        if(file.mkdirs()==false) 
        { 
         Log.v("file is alredy exist in sdcard", "exist file"); 
        }else 
        { 
         Log.v("file is created in card", "new dir"); 
         file.mkdirs(); 
        } 

        File outputFile = new File(file,filenameWithExtension); 
        FileOutputStream fos = new FileOutputStream(outputFile); 

        InputStream is = c.getInputStream(); 
        long total = 0; 

        byte[] buffer = new byte[1024]; 
        int len1 = 0; 
        while ((len1 = is.read(buffer)) != -1) { 
         total +=len1; 

         publishProgress((int)(total*100/lenghtOfFile)); 

         fos.write(buffer, 0, len1); 
        } 
        fos.close(); 
        is.close(); 
      } catch (IOException e) { 
       Log.d("log_tag of background", "Error: " + e); 
       } 
      } 
      Log.v("In aync task filename extension",filenameWithExtension); 

      return filenameWithExtension; 
     } 
+0

れelse条件の実行でまだ完成してない? – user370305

+0

私はすでにそれを行っていますが、ファイルを作成していないので、doInBackground()メソッドの条件が満たされていれば常に問題になります。 –

+0

あなたが良いことを解決したら、私の編集された答えを見てください。 – user370305

答えて

27

あなたは、ファイルが存在するかFile.exists()

​​

を使用して注意ないかどうかを確認することができます:あなたが特定のファイルをチェックしたい場合はexists()があまりにも、ディレクトリの

をtrueを返しますあなたは存在しているかどうかあなたは使用する必要がありますか?File.isFile()

new File("C:/").exists()はtrueを返しますが、ファイルとして開いて読み込むことはできません。

あなたのコードの問題はファイル名がヌルです。

編集2:

はこれを試してみてください:

String filename=""; 
String PATH=""; 
File fileCheck=null; 

public DownloadFile(String _filename) { 
     this.filename=_filename; 
     PATH = Environment.getExternalStorageDirectory()+"/pictures/"+filename; 
     filecheck=new File(PATH); 
    } 

それとも

またはAsyncTaskのonPreExecute()内

は、あなたがこの二つの文を入れて

 PATH = Environment.getExternalStorageDirectory()+"/pictures/"+filename; 
     filecheck=new File(PATH); 
+1

返信ありがとうございます。私はすでにcodloadのdonloadfileクラスをチェックしたところで上記のコードをチェックしてください。 –

+0

+1のため、注意:exist()はディレクトリに対してtrueを返しますが、忘れました。 – user370305

+0

@PavanMore:変数ファイル名がヌルかどうかを確認してください。 –

関連する問題