PDA

View Full Version : Session_End و پاک کردن فایل های زاید



majid_darab
دوشنبه 24 اسفند 1388, 07:40 صبح
با سلام و عرض خسته نباشید :
حتماً برای شما هم پیش اومده که در پروژه ی خود پوشه هایی رو به منظور temp درست کرده باشید و با عمل کردن کاربران اونها رو پروخالی کنید.
خوب عمل خالی کردن این پوشه ها توسط خود کاربر صورت می گیره و در کد بیهایند
حال فرض بفرمایید که توسط یه کاربری فایل های متعددی وارد پوشه ی temp من شده که باید پس از اتمام کار کاربر مزبور پاک بشن.
حالا اگر ناگهان برق سیستم کاربر بره یا بروزر رو ببنده تکلیف این فایل های زاید که قبلاً تو کدبیهایند اونها رو پاک می کردیم چی میشه؟
اولین کاری که کردم این بود که کد زیرو تو session_end نوشتم :

Application.Lock();
//string TargetPhysicalFolder = Server.MapPath("~/Admin/PersonelPixTemp");
string TargetPhysicalFolder = "C:\\Javad\\Darman 6\\Darman\\Admin\\PersonelPixTemp";
string[] pixlist = Directory.GetFiles(TargetPhysicalFolder);
foreach (string pic in pixlist)
{
string picname = pic.Substring(TargetPhysicalFolder.Length + 1);
if (picname.Substring(0, 6) == Session["Co_ID"].ToString() + "_" + Session["User_ID"].ToString() + "_")
{
File.Delete(pic);
}
}
Application.UnLock();این کد به خوبی کار می کند ...
اما مشکل اینجاست که با خط دوم کد که به صورت comment در آوردم (
string TargetPhysicalFolder = Server.MapPath("~/Admin/PersonelPixTemp"))مشکل داره و به محض اجرای آن Application_Error ران می شه.
خوب این کد بدون این خط در حقیقت وقتی پروژه رو سرور سوار شه بی فایده می شه.
آیا راه حلی برای پاک کردن این پوشه ی Temp به ذهنتون می رسه ؟
با تشکر

Mostafa_Dindar
دوشنبه 24 اسفند 1388, 09:04 صبح
سلام
پوشه temp براي چه كاري ؟ ميتوني بيشتر توضيح بدي ؟

majid_darab
دوشنبه 24 اسفند 1388, 11:13 صبح
باید بگم که دراینجا باز هم با Upload فایل سرو کار دارم و خدا می دونه که دنبال روشی گشتم که بتونم بدون پست بک شدن موقع آپلود عکس توسط کاربر درجا image preview داشته باشم.
بگذریم ... این کار نشدنی است.حتی با جاوا اسکریپت
در ضمن به شما اطمینان می دهم که بنا به دلایل امنیتی بروزرهابالاخص ie 8 امکان دسترسی به مسیر فایلی که توسط کاربر قراره آپلود بشه وجود نداره تا بتونیم قبل از save کردن آن یه preview داشته باشیم و به جای این مسیر با آدرس c:\fakepath\filename روبرو خواهید شد.حداقل تو ie 8 که اینجوریه...فایرفاکسم که مادرزاد اینجوری بوده
خوب حالا فقط یه راه برام مونده و اون اینه که اینجور عکس ها رو بریزم تو یه temp که لازمه ی اون پست بک شدن و رفتن سمت سروره و وقتی کاربر قشنگ با کنترل upload کار کرد و چندین بار عکس دلخواهشو انتخاب و مشاهده کرد در نهایت موقع save توسط آی دی کاربرکه اول نام فایل عکس گذاشتم ابتدا فایل tempo کپی می کنم تو پوشه ی اصلی و آدرسشم می دم به دیتابیس و بعد پاکش می کنم .
در ضمن در هر بار مشاهده ی عکس انتخاب شده توسط یک یوزر خاص فایل های temp مربوط به اونو توسط آی دیش پاک می کنم تا فقط یک فایل از اون کاربر تو تمپم باشه.
حالا فرض کنید تعداد کاربران بالا ست و همگی تو یه شهر هستن و برق کل شهر بره و این درحالیه که همشون عکسو انتخاب و مشاهده کردن اما بعد از مشاهده هیچ دکمه ای رو نتونستن کلیک کنن ، یا همشون بیان عکساشونو انتخاب و مشاهده کنن و بعد از مشاهده هیچ دکمه ای رو کلیک نکنن و بروزرو ببندن ....
خوب اینجوری تعداد فایل های temp بالا می ره و همین یه دونه یه دونه ها تبدیل به هزاران فایل عکس زاید می شه.
حالا کاری که می خوام بکنم اینه که در session_end هر کاربر فایل های temp اونو پاک کنم . اینجوری همه چی حل میشه.
که لازمه ی این کار دسترسی داشتن به آدرس فیزیکی پوشه ی temp در پروژه و یه رفت و برگشت به سمت سرور است که ظاهرا تو Sesson_end نمیشه این کارو انجام دادوبا application_error روبرو می شیم.
any idea?

majid_darab
چهارشنبه 26 اسفند 1388, 06:44 صبح
به نظر شما به غیر از session_end دیگه من کجاها می تونم این پوشه ی Temp رو تخلیه کنم ؟
با تشکر

exlord
شنبه 29 اسفند 1388, 14:46 عصر
اولا کدتو به این صورت اصلاح کن........


Application.Lock();
string TargetPhysicalFolder = Server.MapPath("Admin\\PersonelPixTemp");//<-------------
//string TargetPhysicalFolder = "Admin\\PersonelPixTemp";
string[] pixlist = Directory.GetFiles(TargetPhysicalFolder);

foreach (string pic in pixlist)
{
string picname = new FileInfo(pic).Name;//<--------------------
//string picname = pic.Substring(TargetPhysicalFolder.Length + 1);
if (picname.Substring(0, 6) == Session["Co_ID"].ToString() + "_" + Session["User_ID"].ToString() + "_")
{
File.Delete(pic);
}
}
Application.UnLock();

دوما ..... Session_End بعد از بسته شدن صفحه اجرا نمیشه........بلکه Session یه TimeOut داره که پیش فرضش 20 دقیقه است و بعد از اون اجرا میشه Session_End اجرا میشه........

majid_darab
شنبه 29 اسفند 1388, 17:50 عصر
با تشکر از توجه شما دوست عزیز:
والا در مورد session_end من هم فکر شما رو می کردم...
اما اگر با BreakPoint یه تستی بزنی می بینی به محض بسته شدن صفحه هم اجرا می شه...
در ضمن با وجود اصلاحات در کد شما همچنان در خط
string TargetPhysicalFolder = Server.MapPath("Admin\\PersonelPixTemp");//<-------------
مشکل وجود داره و به این خط که می رسه Application_Error ران می شه...
البته این خط کد به خودی خود مشکلی نداره ، اما وقتی تو Session_End کار می شه به مشکل می خوره...
با تشکر

Peyman.Gh
شنبه 29 اسفند 1388, 17:51 عصر
در صورت امکان پروژه را قرار دهید.

exlord
شنبه 29 اسفند 1388, 21:19 عصر
با تشکر از توجه شما دوست عزیز:
والا در مورد session_end من هم فکر شما رو می کردم...
اما اگر با BreakPoint یه تستی بزنی می بینی به محض بسته شدن صفحه هم اجرا می شه...
در ضمن با وجود اصلاحات در کد شما همچنان در خط
string TargetPhysicalFolder = Server.MapPath("Admin\\PersonelPixTemp");//<-------------
مشکل وجود داره و به این خط که می رسه Application_Error ران می شه...
البته این خط کد به خودی خود مشکلی نداره ، اما وقتی تو Session_End کار می شه به مشکل می خوره...
با تشکر

بابامممممم اه اه اه ............ توی Session_End اصلا نمیشه Server.MapPath رو صدا کرد .
این کار رو بکن.............


static string TargetPhysicalFolder;
protected void Session_Start(object sender, EventArgs e)
{
TargetPhysicalFolder = Server.MapPath("Admin\\PersonelPixTemp");//<-------------
}

majid_darab
شنبه 29 اسفند 1388, 23:28 عصر
با سلام بر شما دوستان عزیز و گرامی :
سال 1389 بر شما مبارک و تهنیت باد ...
سالی پر از سی شارپ را برایتان آرزومندم ...
امید است که در سال جدید روزهای خوشی را در کنار ویژوال استودیو به همراه داشته باشید...
و اماّ نمونه پروژه که آقا پیمان خواسته بودند به قرار زیر است ...
راستی در مورد session_start که فرمودید شما در این بخش نه سشن و نه هیچ چیز دیگه تعریف نکردید...

Peyman.Gh
شنبه 29 اسفند 1388, 23:59 عصر
در پروژه شما Session کجا اضافه میشود ؟! کجا استارت میشود ؟!

majid_darab
یک شنبه 01 فروردین 1389, 01:16 صبح
در پروژه شما Session کجا اضافه میشود ؟! کجا استارت میشود ؟!

با سلام
منظورتون خوب نفهمیدم...
خوب session_end تو فایل global.asax می باشد ، همین طور session_start ...
با فرمولی که دوستمون گفتن به نظر مشکل حل شده میاد.(تست شد و جواب داد:تشویق:)
آدرس فیزیکی Temp را که تو session_end نمی تونستم گیر بیارم و ارور میداد رو از تو session_start بدست آوردم و پاسش دادم به session_end (این کارو توسط session انجام دادم)
================================================== =======
این شد یک راه داستان ...
اما آیا راه حل دیگری وجود دارد ؟(برای یادگیری)
در ضمن قضیه ی این session_end چیه که درسته در اینجا داره ارتباط با سرور قطع میشه ، اما مثلا پس چرا تونستم در این قسمت فایل های مزبورو پاک کنم ، اما به کدی که گفتم گیر میداد... در صورتی که فکر می کنم باید به همه ی کد گیر میداد...
با تشکر