删除图片时报:正由另一进程使用,因此该进程无法访问

porschev 2010-02-25 11:18:21
程序上传到服务器,删除图片,
报sys.webforms.pagerequestmanagerservererrorexception:文件“E:***”正由另一进程使用,因此该进程无法访问该文件

在本机运行删除是没有问题的,但上传服务器后出现这个问题。

部分代码如下:

/// <summary>
/// 删除相片按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lbtnDele_Click(object sender, EventArgs e)
{
int photoId = Convert.ToInt32(ViewState["PID"]);
MyPhotos photo = MyPhotosManager.GetMyPhotosByMyPhotosId(photoId);
MyAlbum album = MyAlbumManager.GetMyAlbumByAlbumId(photo.AlbumId);
if (album.HomePhotos == photoId) //如果要删除的相片为相册封面
{
album.HomePhotos = 0; //设置封面字段为0
MyAlbumManager.UpdateAlbum(album);
}
else
{
DeleFile(photo.SavePath); //删除在硬盘上的图片
}
List<PhotoComment> list = PhotoCommentManager.GetAllCommentByPhotoId(photoId);
foreach (PhotoComment c in list)
{
List<ToReply> toList = ToReplyManager.GetAllReplyByCommentId(c.PhotoCommentId);
foreach (ToReply t in toList)
{
ToReplyManager.DeleToReplyByToReplyId(t.ToReplyId); //删除所有回复
}
}
PhotoCommentManager.DeleCommentByPhotoId(photoId); //删除图片的所有评论

int i = MyPhotosManager.DelePhotoById(photoId); //从数据库中删除图片


MyAlbum newAlbum = MyAlbumManager.GetMyAlbumByAlbumId(photo.AlbumId);
int count = newAlbum.PictureNum;
newAlbum.PictureNum = count - 1;
int j = MyAlbumManager.UpdateAlbum(newAlbum); //更新相册照片数

List<MyPhotos> alist = MyPhotosManager.GetAllByAlbumId(newAlbum.AlbumId);

if (alist.Count > 0)
{
PhotoRreOrNext(0); //删除照片后,显示下一张照片
}
else
{
Response.Redirect("photo.aspx"); //如果这个相册只有一张照片,删除就跳入相册首页面
}
}

/// <summary>
/// 删除文件
/// </summary>
/// <param name="filePath"></param>
public void DeleFile(string filePath)
{
try
{
string path = Server.MapPath(filePath);
System.IO.FileInfo DeleFile = new System.IO.FileInfo(path);
if (DeleFile.Exists)
{
DeleFile.Delete();
}
}
catch (Exception ex)
{
throw ex;
}
}



...全文
407 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dksong13 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 porschev 的回复:]
引用 12 楼 happy664618843 的回复:
try
catch 释放资源 重写 dispose方法

高端啊,这个困扰我多个月的问题您这一句代码就解决了!大师!!!!!!!
guozhanlun 2010-06-13
  • 打赏
  • 举报
回复
能说一下解决方法吗?
porschev 2010-02-25
  • 打赏
  • 举报
回复
引用 7 楼 whgjj 的回复:
引用 5 楼 porschev 的回复:引用 4 楼 whgjj 的回复:我也认为是哪里资源没释放,再好好检查一下。主要是你封装的对象中 我找过好多次了。。。主要是在本地上。。。这代码是成功的。。但发布到服务器上就出这问题了。。

哪是不是权限的问题,图片是本地的吗?


图片在服务器上。。。
我是谁 2010-02-25
  • 打赏
  • 举报
回复
引用 5 楼 porschev 的回复:
引用 4 楼 whgjj 的回复:我也认为是哪里资源没释放,再好好检查一下。主要是你封装的对象中

我找过好多次了。。。主要是在本地上。。。这代码是成功的。。
但发布到服务器上就出这问题了。。


哪是不是权限的问题,图片是本地的吗?
jawettren 2010-02-25
  • 打赏
  • 举报
回复
引用 5 楼 porschev 的回复:
引用 4 楼 whgjj 的回复:
我也认为是哪里资源没释放,再好好检查一下。主要是你封装的对象中

我找过好多次了。。。主要是在本地上。。。这代码是成功的。。
但发布到服务器上就出这问题了。。


我也感觉是没释放。
加载图片的时候看看有没有在改变像素的时候
System.Drawing.Image没有Dispose();
porschev 2010-02-25
  • 打赏
  • 举报
回复
引用 4 楼 whgjj 的回复:
我也认为是哪里资源没释放,再好好检查一下。主要是你封装的对象中


我找过好多次了。。。主要是在本地上。。。这代码是成功的。。
但发布到服务器上就出这问题了。。
我是谁 2010-02-25
  • 打赏
  • 举报
回复
我也认为是哪里资源没释放,再好好检查一下。主要是你封装的对象中
porschev 2010-02-25
  • 打赏
  • 举报
回复
引用 2 楼 hitlcyu19 的回复:
删除之前先将file的级别设置成normal试试 最好自己调试一下 加个日志什么的


我试试看。。。。估不是。。。应该是我哪里资源没释放。。。我又找不着
hitlcyu19 2010-02-25
  • 打赏
  • 举报
回复
删除之前先将file的级别设置成normal试试 最好自己调试一下 加个日志什么的
porschev 2010-02-25
  • 打赏
  • 举报
回复
有人解答一下吗?。。。。
porschev 2010-02-25
  • 打赏
  • 举报
回复
解决了。。。。。OYE
porschev 2010-02-25
  • 打赏
  • 举报
回复
引用 12 楼 happy664618843 的回复:
try
catch 释放资源 重写 dispose方法


能详细点吗?
porschev 2010-02-25
  • 打赏
  • 举报
回复
还是不行。。。。。还有不有高手帮我解决一下啊。。
happy664618843 2010-02-25
  • 打赏
  • 举报
回复
try
catch 释放资源 重写 dispose方法
porschev 2010-02-25
  • 打赏
  • 举报
回复
引用 10 楼 getian 的回复:
引用 9 楼 porschev 的回复:我最开始跳入这个页面时,显示图片用了重绘之后缩放 是不是这个方式不好? /// <summary>     /// 加载时显示页面信息     /// </summary>     /// <param name="photoId"> </param>     protected void Display(int photoId)     {         MyPhotos photo = MyPhotosManager.GetMyPhotosByMyPhotosId(photoId);         string path = Server.MapPath(photo.SavePath);          //得到图片的物理路径         System.Drawing.Image image = System.Drawing.Image.FromFile(path);          //生成原图         double height = Convert.ToDouble(image.Height);      //得到原图的高度         double width = Convert.ToDouble(image.Width);        //得到原图的宽度         MyAlbum album = MyAlbumManager.GetMyAlbumByAlbumId(photo.AlbumId);         if (width <= 550 && height <= 550)          //如果小于最大高、宽,原始大小显示         {             imgHome.ImageUrl = photo.SavePath;         }         else if (width <= 550 && height > 550)         {             double flat = width / height;             imgHome.Width = (int)(550 * flat);                       imgHome.Height = 550;             imgHome.ImageUrl = photo.SavePath;         }         else if (width > 550 && height <= 550)         {             double flat = height / width;             imgHome.Width = 550;             imgHome.Height =(int)(550 * flat);             imgHome.ImageUrl = photo.SavePath;         }         else         {             if (width > height)             {                 double flat = height / width;                 imgHome.Width = 550;                 imgHome.Height = (int)(550 * flat);                 imgHome.ImageUrl = photo.SavePath;             }             else             {                 double flat = width / height;                 imgHome.Width = (int)(550 * flat);                 imgHome.Height = 550;                 imgHome.ImageUrl = photo.SavePath;             }         }         lblPostion.Text = album.AlbumName;         lblPostion2.Text = photo.PhotosName;                      txtName.Text = photo.PhotosName;         lblCreateDate.Text = photo.CreateTime.ToShortDateString();         txtDesc.Text = photo.Description;         image.Dispose();          }

建议使用using括起来,保证image.Dispose();执行到。
或者用个Try Cacth,把image.Dispose(); 写到finally里面试试。


我试试看。。。
getian 2010-02-25
  • 打赏
  • 举报
回复
引用 9 楼 porschev 的回复:
我最开始跳入这个页面时,显示图片用了重绘之后缩放

是不是这个方式不好?

/// <summary>
    /// 加载时显示页面信息
    /// </summary>
    /// <param name="photoId"> </param>
    protected void Display(int photoId)
    {
        MyPhotos photo = MyPhotosManager.GetMyPhotosByMyPhotosId(photoId);
        string path = Server.MapPath(photo.SavePath);          //得到图片的物理路径
        System.Drawing.Image image = System.Drawing.Image.FromFile(path);          //生成原图
        double height = Convert.ToDouble(image.Height);      //得到原图的高度
        double width = Convert.ToDouble(image.Width);        //得到原图的宽度
        MyAlbum album = MyAlbumManager.GetMyAlbumByAlbumId(photo.AlbumId);


        if (width <= 550 && height <= 550)          //如果小于最大高、宽,原始大小显示
        {
            imgHome.ImageUrl = photo.SavePath;

        }
        else if (width <= 550 && height > 550)
        {
            double flat = width / height;
            imgHome.Width = (int)(550 * flat);
         
            imgHome.Height = 550;
            imgHome.ImageUrl = photo.SavePath;
        }
        else if (width > 550 && height <= 550)
        {
            double flat = height / width;
            imgHome.Width = 550;
            imgHome.Height =(int)(550 * flat);
            imgHome.ImageUrl = photo.SavePath;
        }
        else
        {
            if (width > height)
            {
                double flat = height / width;
                imgHome.Width = 550;
                imgHome.Height = (int)(550 * flat);
                imgHome.ImageUrl = photo.SavePath;
            }
            else
            {
                double flat = width / height;
                imgHome.Width = (int)(550 * flat);
                imgHome.Height = 550;
                imgHome.ImageUrl = photo.SavePath;
            }
        }
        lblPostion.Text = album.AlbumName;
        lblPostion2.Text = photo.PhotosName;             
        txtName.Text = photo.PhotosName;
        lblCreateDate.Text = photo.CreateTime.ToShortDateString();
        txtDesc.Text = photo.Description;

        image.Dispose();     
    }


建议使用using括起来,保证image.Dispose();执行到。
或者用个Try Cacth,把image.Dispose(); 写到finally里面试试。
porschev 2010-02-25
  • 打赏
  • 举报
回复
我最开始跳入这个页面时,显示图片用了重绘之后缩放

是不是这个方式不好?

/// <summary>
/// 加载时显示页面信息
/// </summary>
/// <param name="photoId"></param>
protected void Display(int photoId)
{
MyPhotos photo = MyPhotosManager.GetMyPhotosByMyPhotosId(photoId);
string path = Server.MapPath(photo.SavePath); //得到图片的物理路径
System.Drawing.Image image = System.Drawing.Image.FromFile(path); //生成原图
double height = Convert.ToDouble(image.Height); //得到原图的高度
double width = Convert.ToDouble(image.Width); //得到原图的宽度
MyAlbum album = MyAlbumManager.GetMyAlbumByAlbumId(photo.AlbumId);


if (width <= 550 && height <= 550) //如果小于最大高、宽,原始大小显示
{
imgHome.ImageUrl = photo.SavePath;

}
else if (width <= 550 && height > 550)
{
double flat = width / height;
imgHome.Width = (int)(550 * flat);

imgHome.Height = 550;
imgHome.ImageUrl = photo.SavePath;
}
else if (width > 550 && height <= 550)
{
double flat = height / width;
imgHome.Width = 550;
imgHome.Height =(int)(550 * flat);
imgHome.ImageUrl = photo.SavePath;
}
else
{
if (width > height)
{
double flat = height / width;
imgHome.Width = 550;
imgHome.Height = (int)(550 * flat);
imgHome.ImageUrl = photo.SavePath;
}
else
{
double flat = width / height;
imgHome.Width = (int)(550 * flat);
imgHome.Height = 550;
imgHome.ImageUrl = photo.SavePath;
}
}
lblPostion.Text = album.AlbumName;
lblPostion2.Text = photo.PhotosName;
txtName.Text = photo.PhotosName;
lblCreateDate.Text = photo.CreateTime.ToShortDateString();
txtDesc.Text = photo.Description;

image.Dispose();
}

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧