View Full Version : نحوه حذف فایلی که در اثر قطع شدن اینترنت ، ناقص دانلود شده !
moralschool
پنج شنبه 04 اردیبهشت 1393, 23:26 عصر
ما یه برنامه داریم که برای دانلود فیلم به اینترنت وصل میشه
یعنی وقتی کاربر روی دکمه دانلود کلیک میکنه برنامه تشخصی میده که گوشی به اینترنت متصل هست یا نه و اگه متصل بود شروع میکنه به دانلود فایل ...
و البته دستور دادم که اگه کاربر روی دکمه back گوشی بزنه اول دانلود متوقف بشه و بعدش فایل رو از مسیری که ذخیره میشه حذف کنه که بعدا بتونه دوباره دانلودش کنه ...
حالا مشکل اینجاست که وقتی اینترنت به هر دلیلی حتی یه لحظه قطع بشه ، خب در اصل فایل که یه فیلم هست ، هنوز کامل دانلود نشده ، به همین خاطر وقتی کاربر برای دانلود مجدد روی دکمه دانلود میزنه ، میگه فایل قبلا دانلود شده و بهش اجازه دانلود مجدد نمیده ( ضمنا فایل ناقص رو هم پخش نمیکنه ! )
دلیلش هم اینه که اون فایل ناقص دانلود شده توی پوشه و مسیری که ذخیره میشه ، وجود داره و اگه کاربر بره و دستی اونو حذف کنه مشکل حل میشه و میتونه دوباره فایل رو دانلود کنه ...
(((( حالا میخواستم ببینم چطوری میشه بگم که اگر در حین دانلود فایل ، اینترنت به هر دلیل قطع شد ، و فایل ناقص دانلود شده بود ، فایلی که داشت دانلود میشد ، از اون مسیر ذخیره شده حذف بشه ؟؟؟؟ ))))
نمیدونم تونستم منظورمو خوب برسونم یا نه ؟!
darkenerboy
پنج شنبه 04 اردیبهشت 1393, 23:47 عصر
دوست عزیز
شما دو راه داری
یک:
شما باید مدیریت خطا انجام بدی
و در صورت بروز خطای مورد نظر فایلت رو حذف کنی
دو:
قبل از دانلود بررسی کنی که اگه فایل هستش اون رو حذف کنی
البته شما باید در انتهای فایلی که داری دانلود میکنی یه چیزی اضافه کنی
مثلا .tmp و بعد از اتمام دانلود فایلت رو rename کنی !
moralschool
پنج شنبه 04 اردیبهشت 1393, 23:54 عصر
ممنون از پاسختون
همون روش اول بهتره ولی نمیدونم چطوری میشه این کار رو کرد
چه دستوری میخواد که بگه اگه اینترنت در حین دانلود قطع شد فلان کار رو انجام بده ؟
من دستور اینکه اگه خود کاربر دانلود رو کنسل کرد رو دادم که فایل رو از مسیری که هست حذف میکنه ولی حالا دستور اینکه ((( اگه اینترنت قطع شد))) چی هست ؟
smemamian
جمعه 05 اردیبهشت 1393, 00:20 صبح
سلام
با Download Manager دانلود می کنید ؟
moralschool
جمعه 05 اردیبهشت 1393, 00:42 صبح
نه ...
برای چک کردن اتصال اینترنت از این کد استفاده کردم :
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.ST YLE_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();
}
}
});
حالا چه دستوری باید بدم که اگه در حین دانلود اینترنت قطع شد فایل از مسیر مشخص شده حذف بشه ؟
چون اگه حذف نشه میگه که فایل قبلا دانلود شده و اجازه دانلود مجدد نمیده ...
اصلا کسی پیشنهاد دیگه ای داره که بهتر بشه این کار رو انجام داد ؟
darkenerboy
جمعه 05 اردیبهشت 1393, 09:35 صبح
به نظر من که راه دوم خیلی بهتره
من بیشتر دوستش دارم
ولی فکر کنم توی IOException باید دستور حذف رو بنویسی و برای این کار باید یه catch دیگه به try اضافه کنی !
و دوباره فرمان دانلود رو اجرا کنی !
ولی تو راه دوم همون اول بررسی میکنی و اگه فایل وجود داشت پاکش میکنی و دانلود رو شروع میکنی
بدون دردسر
واسه این کار تو خط 98 انتهای اسمش یک چیزی اضافه میکنی
بعد از اتمام دانلود فایلت رو rename میکنی
اول قبل از شروع دانلود هم چک میکنی اگه بود پاکش میکنی
به همین راحتی
موفق باشی
smemamian
جمعه 05 اردیبهشت 1393, 10:09 صبح
با Download Manager شما راحت تر می تونید بررسی کنید.
البته راه ی که دوستمون آقای @darkenerboy (http://barnamenevis.org/member.php?157652-darkenerboy) گفتن هم می تونید
انجام بدین.
با Download Manager
وقتی فایلی در صف دانلود قرار میگیره یک عدد Long برمی گردونه
که Unique هست. شما می تونید یک Receiver تعیین کنید، و وقتی
فایل به درستی دانلود شد، به کمک
DownloadManager.EXTRA_DOWNLOAD_ID شماره
ID اون فایلی که تمام شده رو دریافت کنید. سپس با اون عدد Longی
که صف دانلود برای شما برگرداننده مقایسه کنید. اگر یکسان بود، فایل
به درستی دانلود شده و در غیر این صورت فایل هنوز به صورت کامل
دانلود نشده است.
moralschool
جمعه 05 اردیبهشت 1393, 11:13 صبح
من نام فایل رو هم بعد از دانلود تغییر دادم ولی بازم وقتی اینترنت قطع بشه فایل ذخیره میشه و میگه فایل دانلود شده !
لطفا اگه میشه در کدها کمک کنید
کمی دقیقتر بگید که catch رو در کجا و به چه شکل باید ایجاد کنم
ممنون
moralschool
جمعه 05 اردیبهشت 1393, 14:54 عصر
فکر میکنم بهتر باشه مشخص کنم که اگه حجم فایل دانلود شده برابر با حجم فایلی باشه که باید دانلود بشه بهتره ...
یعنی برنامه در پایان دانلود چک کنه که اگه حجم برنامه مثلا 5.3 مگابایت بود ، فایل که یه فیلم هست پخش بشه و اگر از 5.3 مگابایت کمتر بود فایل حذف بشه
لطفا در اینکه چطور این دستور رو به برنامه بدم راهنمایی کنید
moralschool
شنبه 06 اردیبهشت 1393, 12:57 عصر
در مورد چک کردن حجم کسی هست کمک کنه لطفا
darkenerboy
شنبه 06 اردیبهشت 1393, 16:23 عصر
در مورد چک کردن حجم کسی هست کمک کنه لطفا
دوست گرامی
شما با نام فایل خیلی راحت به چیزی که میخوای میرسی
بعد میخوای کلی خودت رو درگیر حجم کنی ؟
یک کیلوبایت اینو اونور شه فالت رو قبول نمیکنه
شما بجای خط 98 این رو بنویس
File outputFile = new File("/sdcard/filmha/film1.mp4" + ".tmp");
output = new FileOutputStream(outputFile);
خط 114 یک اینتر بزن این رو بنویس
outputFile.renameTo(new File("/sdcard/filmha/film1.mp4"));
moralschool
شنبه 06 اردیبهشت 1393, 23:08 عصر
ممنون darkenerboy عالی بود با راهنمایی و ایده ی خیلی خوب شما مشکل حل شد ... دستت طلا
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.