انجمن سایت کلیدستان


رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !

نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !

#1
ما یه برنامه داریم که برای دانلود فیلم به اینترنت وصل میشه
یعنی وقتی کاربر روی دکمه دانلود کلیک میکنه برنامه تشخصی میده که گوشی به اینترنت متصل هست یا نه و اگه متصل بود شروع میکنه به دانلود فایل ...
و البته دستور دادم که اگه کاربر روی دکمه back گوشی بزنه اول دانلود متوقف بشه و بعدش فایل رو از مسیری که ذخیره میشه حذف کنه که بعدا بتونه دوباره دانلودش کنه ...
حالا مشکل اینجاست که وقتی اینترنت به هر دلیلی حتی یه لحظه قطع بشه ، خب در اصل فایل که یه فیلم هست ، هنوز کامل دانلود نشده ، به همین خاطر وقتی کاربر برای دانلود مجدد روی دکمه دانلود میزنه ، میگه فایل قبلا دانلود شده و بهش اجازه دانلود مجدد نمیده ( ضمنا فایل ناقص رو هم پخش نمیکنه ! )
دلیلش هم اینه که اون فایل ناقص دانلود شده توی پوشه و مسیری که ذخیره میشه ، وجود داره و اگه کاربر بره و دستی اونو حذف کنه مشکل حل میشه و میتونه دوباره فایل رو دانلود کنه ...

(((( حالا میخواستم ببینم چطوری میشه بگم که اگر در حین دانلود فایل ، اینترنت به هر دلیل قطع شد ، و فایل ناقص دانلود شده بود ، فایلی که داشت دانلود میشد ، از اون مسیر ذخیره شده حذف بشه ؟؟؟؟ ))))

نمیدونم تونستم منظورمو خوب برسونم یا نه ؟!
 
پاسخ

نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !

#2
سلام.
برای دانلود فایل از اینترنت، معمولا از try و catch استفاده می شود و بنابراین تعدادی Exception تعریف می کنیم، پس شما می توانید تعیین کنید که در صورت به وقوع پیوستن هر یک از آن Exception ها، فایل مورد نظر (در صورت وجود)، حذف شود. 
علاوه بر این، شما می توانید کدهایی بنویسید که بتوانید دو حالت ((دانلود کامل)) و ((دانلود ناقص)) را از هم تشخیص بدهید، این رو به این دلیل میگم که اصلا فرض کنید حالتی پیش بیاد که حتی به اجرای Exception ها هم نرسیم (مثلا بستن اجباری برنامه اندروید توسط خود کاربر، تمام شدن باتری، درآوردن ناگهانی باتری، ضربه خوردن گوشی و از این جور اتفاقات عجیب !). به نظرم برای تشخیص می توان که حجم فایل را هم چک کرد، مثلا فایلتون بر روی سرور اینترنتی دارای حجم 3.1 مگابایت هست، پس چک کنیم که فایل موجود در مسیر مورد نظرمان، دارای همین حجم  باشد، اگر کمتر بود باید حذف شده و دوباره دانلود شود.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط moralschool

نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !

#3
این چیزی که میگید تشخیص بده حجم فایل رو خیلی خوبه
ولی فکر میکنم بهتره به این فکر باشم که اگه دانلود قطع شد کاربر بتونه بعدا فایل رو از ادامه دانلود کنه یعنی همون resum
نمیدونم میشه این کارو کرد یا نه ؟



ببینید من برای چک کردن اتصال اینترنت از این کد استفاده میکنم :



کد:
private boolean isNetworkConnected() {
// check internet connection
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
// There are no active networks.
Toast.makeText(getApplicationContext(), "براي دريافت اين فايل ، يکبار مي بايست به اينترنت متصل شويد", Toast.LENGTH_LONG).show();
return false;
} else
return true;
}

و در دکمه دانلود هم کدهام اینه :



کد:
ImageView imgdownload1 = (ImageView) findViewById(R.id.imageView1);
imgdownload1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
File file = new File(root.getAbsolutePath() + "/filmha/" + "film1.mp4");
if (file.exists() ){
Toast.makeText(getApplicationContext(), "فايل قبلا دانلود شده است", Toast.LENGTH_LONG).show();
return;
}

if(isNetworkConnected()){ // check internet connection // instantiate it within the onCreate method
mProgressDialog = new ProgressDialog(Film.this);
// MainActivity = activity name mProgressDialog.setMessage("فايل در حال دانلود مي باشد"); mProgressDialog.setIndeterminate(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(true);
// execute this when the downloader must be fired
final DownloadTask downloadTask = new DownloadTask(Film.this);
// MainActivity = activity name
downloadTask.execute("http://www.dl.moralschool.ir/film1.mp4");
// the url to the file you want to download
mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) { downloadTask.cancel(true);
File file = new File(root.getAbsolutePath() + "/filmha/" + "film1.mp4");
if (file.exists() ){
file.delete();
Toast.makeText(getApplicationContext(), "فايل دانلود نشد", Toast.LENGTH_LONG).show(); return;
}
}
});
}
}
// usually, subclasses of AsyncTask are declared inside the activity class.
// that way, you can easily modify the UI thread from here class DownloadTask extends AsyncTask<String, Integer, String> { private Context context;
public DownloadTask(Context context) { this.context = context;
}
@Override
protected String doInBackground(String... sUrl) {
// take CPU lock to prevent CPU from going off if the user
// presses the power button during download PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
wl.acquire();
try { InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
try { URL url = new URL(sUrl[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
// expect HTTP 200 OK, so we don't mistakenly save error report
// instead of the file if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) return "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage();
// this will be useful to display download percentage
// might be -1: server did not report the length int fileLength = connection.getContentLength();
// download the file input = connection.getInputStream();
output = new FileOutputStream("/sdcard/filmha/film1.mp4");
// /sdcard/file_name.extension byte data[] = new byte[4096];
long total = 0; int count; while ((count = input.read(data)) != -1) {
// allow canceling with back button if (isCancelled()) return null; total += count;
// publishing the progress.... if (fileLength > 0)
// only if total length is known publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
}
catch (Exception e) { return e.toString();
} finally{
try {
if (output != null) output.close();
if (input != null) input.close();
}
catch (IOException ignored) { } if (connection != null) connection.disconnect();
}
}
finally { wl.release();
} return null;
}
@Override
protected void onPreExecute() { super.onPreExecute();
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress);
// if we get here, length is known, now set indeterminate to false mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(String result) { mProgressDialog.dismiss();
if (result != null) Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show();
else
Toast.makeText(context,"فايل با موفقيت دانلود شد", Toast.LENGTH_SHORT).show();
VideoView vv=(VideoView) findViewById(R.id.videoView1);
vv.setVideoURI(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/filmha/" + "film1.mp4"))); vv.start(); vv.requestFocus();
}
}
});


حالا چیزی که میخوام اینه که اگه اینترنت قطع شد مثلا فایل حذف بشه یعنی کد اینکه چک کنه اینترنت قطع شده چی هست ؟
یا اینکه اگه بشه در صورت قطع شدن اینترنت یا همون چیزی که شما گفتید به هر دلیل و اتفاقی اگه فایل دانلود نشد ، در دانلود مجدد از ادامه فایل رو دانلود کنه که خیلی میتونه بهتر باشه

 
پاسخ

نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !

#4
نمی تونیم همزمان با دانلود فایل، هر لحظه چک کنیم که آیا اینترنت وصل هست یا نه. اون کد هم تنها برای شروع دانلود می باشد که اگر اینترنت قطع هست، اصلا دانلود فایل رو شروع نکنیم.
ایده resume خوبه، اما در این زمینه تا حالا کار نکردم و باید به دنبال کدهایی برای آن باشید.
در ضمن، برای چک کردن وصل بودن اینترنت، علاوه بر کدهایی که ذکر کردید، یک روش دیگر هم در مبحث زیر استفاده شده که فکر کنم کارایی بهتری داشته باشد (ربطی به سوال شما ندارد و تنها چون دیدم کدهای چک کردن اتصال به اینترنت را نوشته اید، گفتم بد نیست این مورد را هم تذکر بدهم) :

http://www.kelidestan.com/keys/keys.php?key=312

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط moralschool ، sohrabjam

نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !

#5
حالا ما باید اگه اینترنت به هر دلیل قطع شد تشخیص بدیم و فایل رو از مسیر ذخیره شده حذف کنیم
این تشخصیش مهمه برای جواب این مشکل
پاسخ

نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !

#6
باید ببینید که کدام Exception مربوط به قطع اینترنت می باشد. یعنی ما می خواهیم که به محض قطع شدن اینترنت، تشخیص بدهیم و کد مربوط به حذف فایل را اجرا کنیم. مثلا من بخشی از کد نوشته شده در کلید زیر را در اینجا براتون می نویسم :

http://www.kelidestan.com/keys/keys.php?key=296

بخش اصلی مربوط به دانلود، به صورت زیر می باشد :

کد:
try {
                     InputStream input = null;
                     OutputStream output = null;
                     HttpURLConnection connection = null;
                     try {
                         URL url = new URL(sUrl[0]);
                         connection = (HttpURLConnection) url.openConnection();
                         connection.connect();

                         // expect HTTP 200 OK, so we don't mistakenly save error report
                         // instead of the file
                         if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
                              return "Server returned HTTP " + connection.getResponseCode()
                                  + " " + connection.getResponseMessage();

                         // this will be useful to display download percentage
                         // might be -1: server did not report the length
                         int fileLength = connection.getContentLength();

                         // download the file
                         input = connection.getInputStream();
                         output = new FileOutputStream("/sdcard/myFile.apk");  //   /sdcard/file_name.extension

                         byte data[] = new byte[4096];
                         long total = 0;
                         int count;
                         while ((count = input.read(data)) != -1) {
                             // allow canceling with back button
                             if (isCancelled())
                                 return null;
                             total += count;
                             // publishing the progress....
                             if (fileLength > 0) // only if total length is known
                                 publishProgress((int) (total * 100 / fileLength));
                             output.write(data, 0, count);
                         }
                     } catch (Exception e) {
                         return e.toString();
                     } finally {
                         try {
                             if (output != null)
                                 output.close();
                             if (input != null)
                                 input.close();
                         }
                         catch (IOException ignored) { }

                         if (connection != null)
                             connection.disconnect();
                     }
                 } finally {
                     wl.release();
                 }

خوب حالا شما باید ببینید که قطع اینترنت، کدام Exception را به وجود می آورد و در کدهای مربوط به آن، کد حذف فایل را بنویسید (حذف در صورتی که قبلا ساخته شده باشد).
برای try و catch و finally ، بد نیست نگاهی به راهنمای زیر بیندازید :

کد:
try {
    // Normally this code runs from the top of the block to the bottom
    // without problems. But it can sometimes throw and exception,
    // either directly or with a throw statement or intdirectly by calling
    // a method that throws and exception.
}
catch (SomeException e1) {
    // This block contains statements that handle the exception object
    // of type SomeException or a subclass of that type. Statements in
    // this block can refer to that exception object by the name e1.
}
catch (AnotherException e2) {
    // This block contains statements that handle the exception object
    // of type AnotherException or a subclass of that type. Statements in
    // this block can refer to that exception object by the name e2.
}
finally {
    // This block contains statements that are ALWAYS executed
    // after leaving the try clause, regardless of whether we leave it:
    // 1) normally after reaching the bottom of the block;
    // 2) because of a break, continue, or return statement;
    // 3) with an exception handled by a catch clause above; or
    // 4) with an uncaught exception that has not been handled.
    // If the try clause calls System.exit(), however, the interpreter
    // exits before the finally clause can be run.
}

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !

#7
ممنونم از راهنماییتون
من این سوال رو در جایی دیگه هم مطرح کرده بودم و خدا رو شکر به جواب رسیدم
نظر یکی از دوستان این بود که بعد از دانلود فایل نام فایل رو تغییر بدیم یعنی اول بهش یه پسوند اضافه میکنیم در حین دانلود :


کد:
File outputFile = new File("/sdcard/filmha/film1.mp4" + ".tmp");
output = new FileOutputStream(outputFile);

و بعد از اتمام دانلود نامش رو تغییر بدیم :


کد:
outputFile.renameTo(new File("/sdcard/filmha/film1.mp4"));

اینجوری مشکل حل شد

بازم ممنونم از راهنمایی های شما هم ...
یه سوال دیگه برام پیش اومده که در یه موضوع جدید مطرح میکنم
 
پاسخ
 سپاس شده توسط admin ، شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان