ورود

View Full Version : سوال: خطای it is being used by another process. هنگام حذف عکس ها



moferferi
پنج شنبه 18 آبان 1391, 20:09 عصر
سلام
نمیدونم چرا موقع حذف عکس ها با خطای
The process cannot access the file 'E:\asp.net\p1\photos\gallery\cheetoz.gif' because it is being used by another process.

در صورت امکان لطفا یه نگاهی به سورس بکنید.
در ضمن کد ها در یوزر کنترل هست

<div class="content-warp">
<h3 class="pageinfo">مدیریت گالری عکس</h3>
<telerik:RadUpload ID="RadUpload1" Runat="server">
<localization add="اضافه" delete="حذف" remove="حذف" select="انتخاب" />
</telerik:RadUpload>
<telerik:RadScriptManager ID="RadScriptManager1" Runat="server">
</telerik:RadScriptManager>
<br />
<asp:Button id="btnup" runat="server" Text="آپلود" CssClass="btn"
onclick="btnup_Click"/>

<hr />
<div class="dvgallerypic dvgallerypic-admin">
<ul>
<asp:DataList runat="server" ID="rpt1" RepeatColumns="6" >
<ItemTemplate>
<li><aclass="preview"><img class="thumb" src="<%#Container.DataItem %>"/></a><br /><a href="admin.aspx?page=gallerypic&mod=del&id=<%#Container.DataItem %>">حذف</a></li>
</ItemTemplate>
</asp:DataList>
</ul>
</div>
</div>
این هم کدی سی شارپ
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using resanehpardazModel;
using Telerik.Web.UI;
using System.IO;
public partial class AdminModule_GalleryPic_GalleryPic : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request["mod"] == "del")
{
deletefile();
}
if (!Page.IsPostBack)
{
rpt1.DataSource = Getphotos();
rpt1.DataBind();
}
//rpt1.DataSource = Getphotos();
//rpt1.DataBind();
}
protected void btnup_Click(object sender, EventArgs e)
{
string path = Request.MapPath(".") + "//photos/gallery//";
foreach (UploadedFile f in RadUpload1.UploadedFiles)
{
f.SaveAs(path + "//" + f.FileName);
}
rpt1.DataSource = Getphotos();
rpt1.DataBind();
}
public List<String> Getphotos()
{
List<string> photos = new List<string>();
string photoPath = MapPath("~/photos/gallery/");
string[] files = Directory.GetFiles(photoPath);
foreach (string photo in files)
{
photos.Add("photos/gallery/" + Path.GetFileName(photo));
}
return photos;

}
private void deletefile()
{
FileInfo TheFile = new FileInfo(MapPath("~") + "\\" + Request["id"].ToString());

File.Delete(MapPath("~")+"\\" + Request["id"].ToString());
//rpt1.DataSource = Getphotos();
//rpt1.DataBind();
}
}

PhoenixNet
پنج شنبه 18 آبان 1391, 23:51 عصر
خط


FileInfo TheFile = new FileInfo(MapPath("~") + "\\" + Request["id"].ToString())


حذف کن یا اگه استفاده می کنی فایل رو ببندش.

fakhravari
جمعه 19 آبان 1391, 00:08 صبح
دیگر موارد میتوانید حذف کنید؟

moferferi
جمعه 19 آبان 1391, 11:40 صبح
مشکل را فهمیدم از کجاست ولی نمیدونم چطوری حلش کنم
من در صفحه اول سایتم از این گالری عکس استفاده میکنم.البته برای اینکه عکس ها را به صورت thumb نشون بدم اومدم و از یک ماژولی که توی سایت http://how2learnasp.net/ واسه این کار معرفی شده بود
استفاده کردم.
به این صورت فهمیدم که اومدم و سیستم را ریست کردم و به جای اول صفحه مدیریت عمس ها را باز کردم و بدون مشکل و خطا عکس ها پاک شد.ولی وقتی که اومدم و صفحه اول که این گالری عکس توش هست را باز کردم ذوباره وقع حذف عکس ها به مشکل برخوردم.
با این اوصاف فکر کنم استفاده از این ماژول چندان نطقی به نظر نرسه.احتمالا بار زیادی روی سرور میاره.
لطفا شما هم نظرتون را دراین مورد بگین

moferferi
جمعه 19 آبان 1391, 12:02 عصر
اینم ماژولی که گفتم ازش استفاده میکنم
http://www.how2learnasp.net/article.aspx?code=3950a76e-1753-4b49-90e4-b6e22f33f082

fakhravari
جمعه 19 آبان 1391, 12:51 عصر
مشکل شما از چیز دیگری است.
این خطا زمان رخ میدهد که از فایل داره استفاده میشه و شما قصد حذف اونو دارید
اون سمپل چیزی نبود کی سری عکس با پسوند برسی و ذخیره میکرد.

moferferi
جمعه 19 آبان 1391, 17:43 عصر
بله حق با شما بود.کلا ماژول را حذف کردم.و جالبه به صورت دستی هم از روی هارد پاک نمیشه.موقع حذف پیغام میده که فایل شما توسط iis در حال اجرا و استفاده میباشد.
iis را stop کردم فایل ها پاک شد.
به نظر شما مشکل از این متد نیست
public List<String> Getphotos() {
List<string> photos = new List<string>();
string photoPath = MapPath("~/photos/gallery/");
string[] files = Directory.GetFiles(photoPath);
foreach (string photo in files)
{
photos.Add("photos/gallery/" + Path.GetFileName(photo));
}
return photos;

}

moferferi
جمعه 19 آبان 1391, 21:28 عصر
ببخشید سمپل را اشتباهی گذاشته بودم.اصلاحش کردم.
دوستان اگه کسی تجربه ای تو این زمینه داره کمک کنه؟

fakhravari
جمعه 19 آبان 1391, 21:40 عصر
بله حق با شما بود.کلا ماژول را حذف کردم.و جالبه به صورت دستی هم از روی هارد پاک نمیشه.موقع حذف پیغام میده که فایل شما توسط iis در حال اجرا و استفاده میباشد.
iis را stop کردم فایل ها پاک شد.
به نظر شما مشکل از این متد نیست
public List<String> Getphotos() {
List<string> photos = new List<string>();
string photoPath = MapPath("~/photos/gallery/");
string[] files = Directory.GetFiles(photoPath);
foreach (string photo in files)
{
photos.Add("photos/gallery/" + Path.GetFileName(photo));
}
return photos;

}


متد بالا لیست در میاره.
نه مشکل از جای دیگری
اگر زیاد گیر میده فعلا با try و catch جلوشو بگیر

moferferi
جمعه 19 آبان 1391, 22:08 عصر
try و catch فقط جلوی خطا را میگیره.من میخوام مشکلم حل بشه.
اومدم و به جای استفاده از لیست از دیتابیس استفاده کردم.ولی بازم فایده نداشت.

fakhravari
جمعه 19 آبان 1391, 22:45 عصر
دوستان دیگه در مورد حذف فایل کمک کنن.

moferferi
شنبه 20 آبان 1391, 15:04 عصر
بالاخره فهمیدم مشکل از کجاست.
موقع اپلود از دستوری استفاده میکردم که از عکس یه thumbnails بسازه.اونجا image باز بود و بسته نشده بود.که با دستور image.Dispose(); مشکل حل شد.

hashemt4
یک شنبه 06 مهر 1393, 10:10 صبح
هرجا که میخایین عکس رو ذخیره یا ویرایش یا حذف کنید از این دستور استفاده کنید

protected void btnUploadClick(object sender, EventArgs e) {
// ...
lock (_lock) {
FileUpload1.PostedFile.SaveAs(sTempName);
}
// ...
}


protected void btnDeleteClick(object sender, EventArgs e) {
// ...
lock (_lock) {
File.Delete(sTempName);
}
// ...
}

قبلش هم این تابع رو تعریف کنید

private static object _lock = new object();