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

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;
}
}



...全文
406 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();
}
【SA默认密码:593106】 使用环境: Windows OS(vista/win7/win8/xp/2000/2003) 不支持Windows 9x 软件功能: 1、MSSQL2000数据库服务开启、关闭控制; 2、基本数据库操作(改密码、数据库新建、删除、分离、附加、备份、恢复); 3、日志和连接信息,简易防火墙,自启动设置,计划任务(自动备份与执行)等。 注意事项: 1、本软件必须定义实例名和端口,本软件中的数据库无目录限制; 2、新建、附加和恢复数据库,这几项操作会将数据库保存或转移到本软件所在目录的DATA目录下,同时也会将数据库文件的物理文件名和逻辑名进行调整; 3、删除、分离数据库时,会自动清除目标数据库的用户连接; 4、防火墙仅仅是实现根据连入PC的网卡地址进行连接断开的操作,没啥用^_^; 5、计划任务只有在勾选时才会写入配置文件,在开启服务后才会读取并开启任务,如果计划任务中定义的数据库被删除或分离,任务会自动取消; 6、如果需要使用默认实例,请千万不要发布到有安装MSSQL且使用默认实例的机子上去,会造成目标机子上的MSSQL无法正常使用; 7、管理员帐号SA的默认密码是593106,第一次解锁时请输入这一密码,然后自行在数据库页修改密码。 使用方法: 运行程序》设置实例名》设置端口》开启。 如果需要让程序自动开启服务,请勾选自动开启,开机启动表示随OS启动。 与您的软件一起分发的方法: 1、运行本程序; 2、勾选 自动开启、开机启动和服务守护; 3、将本软件及附属文件一起打包进您的安装程序中。 您也可以将您需要分发的软件所用数据库直接附加或恢复到本软件中,从而省去恢复数据库的操作。 关于vista/win7/win8中UAC未禁用时无法开机自启动的情况,请按以下步骤解决: 1、运行本程序,设置好 实例名称和服务端口,勾选自动开启和服务守护; 2、打开 开始》控制面板》系统和安全》计划任务; 3、创建任务》常规》输入名称》勾选下面的 使用最高权限运行; 触发器》开始任务 选择 登录时》设置 选择 所有用户》高级设置 勾选 启用; 操作》操作 选择 启动程序》程序或脚本 选择 迷你SQL2000目录下的sql2k.exe; 4、以上设置完成后,点击 确定 进行保存,然后就可以重启win7进行测试了。 分发时请不要包含本说明文件,增加您自定义的说明文本即可。 更新日志: *修正 +增加 -去除 ^调整 1.2.6 *还原数据库时,修正输入库名时点取消后没有中止还原等错误; +查询分析器添加语法高亮支持; *修正关闭服务时,有机率卡顿的现象,进行了优化处理; +在操作系统关闭时,自动停止服务,防止数据丢失。 1.2.5 +数据库页增加查看我的表功能菜单项,可管理视图、存储过程及自定义函数和查看表结构等; ^部分菜单及按钮增加图标,增加美观度; +内存管理页增加AWE开关,以解决部分电脑内存不足造成运行缓慢的问题,AWE功能也占内存。 1.2.4 ^选择开机启动时,会自动删除与软件关联的注册表项,防止变更实例名造成注册表残留,对于已登记开机启动,又直接删除了软件的,请手工删除注册表Run项中的残留; *修正部分win7系统下无法正常解锁的问题(系统无法访问127.0.0.1造成); *修正部分文字描述内容错误(漏字或多打字等)。 1.2.3 +数据库页面,集成外部工具“查询分析器”与“事件探查器”,系SQL自带程序,方便使用; -删除内置“查询分析”功能页; ^数据库页面,密码修改,允许任意字符,不再限制只能为0~9a~z了,但不允许为空; ^数据库内核升级至8.00.2305,开启AWE,支持大内存(超2G)及修复漏洞; +增加SQL Tips页,记录一些常用的SQL语句,方便查阅; ^标题栏解锁界面和密码修改页面进行调整,增加多语言支持。 1.2.2 *附加数据库时,修正输入库名时点取消后没有中止附加等错误; +增加面板锁,点击左上角的金锁,输入SA用户密码,输入正确则打开面板,否则隐藏面板,不限制开、关服务; +数据库页面,右键菜单增加打开文件目录,方便用户操作; +增加内存管理页,控制SQL Server内存占用,与企业管理器相同。 1.2.1 ^未开启服务时,关闭窗口会退出程序,开启服务时,关窗窗口则是隐藏; *附加数据库时,修正目标目录与源目录相同时无法附加的问题。 1.2.0 +增加托盘区菜单项“重启”,方便重启SQL服务; ^附加数据库文件时,将移动改为复制,原文件不会被删除; +计划任务在备份数据库后,自动清除旧备份,只保留最后5个备份(按文件,不按时间); *修正计划任务无法正确执行的问题,由皮肤引起的。 1.1.9 +增加win8的支持,增加皮肤以美化界面; +增加查询分析器,方便使用SQL操作数据库; +增加简体、繁体语言切换,方便港台及深圳用户使用。 1.1.8 ^计划任务中执行SQL语句变更为执行SQL脚本文件,支持GO分隔,方便执行复杂任务。 1.1.7 +配置文件中增加AppTitle字符串项,如果有输入内容,则在启动时会以该项的值为窗口标题;繁体用户请将配置文件保存为Unicode格式; *修正没有清除默认实例注册表项的问题。 1.1.6 +控制程序增加对指定消息的处理,方便用户控制迷你数据库,详见包内的“控制demo”例程。 1.1.5 +同目录下只允许启动一个EXE,互斥对象,不影响启用多实例; ^原“恢复”变更为“还原”,还原时显示默认的数据库名称; +显示数据库状态,在数据库页的右键菜单项上增加修复置疑和联机数据库功能项; +勾选默认实例时,先进行检测,如安装了MSSQL服务,则禁止勾选默认实例; +计划任务,备份计划处增加选择目录的图片按钮,方便操作。 1.1.4 ^调整关闭服务过程,等待所有SQL任务执行完毕后才会关闭服务,确保用户操的作完整性; +增加服务进程窗口的显示选项,可即可查看服务日志; ^优化启动时的部分设置,提高效率,减少资源占用。 1.1.3 *修正内存释放问题,旧版会造成内存递增。 1.1.2 ^计划任务、执行脚本、恢复和备份数据库时,不限制指令执行等待时间,以免超时; *修正部分文字内容的显示错误; +增加按计算机名和IP地址访问实例的参考连接字提示; *修正启动时的一个参数错误,解决日志勾选切换造成启动失败的问题。 1.1.1 ^优化提示信息,更加人性化,执行脚本时会显示正在执行第几个脚本文件; ^优化启动服务的代码,默认实例或指定实例运行时更加稳定; ^优化数据库页右键菜单显示,允许对系统库进行操作。 1.1.0 +增加同个目录只允许运行一个实例的自动处理; *修正开启服务过程中碰到异常时,没有修改实例状态的错误; +支持强制使用默认实例,也就是使用1433端口和空实例名。 ps:升级了tools目录下的makesql和runsql,均支持unicode,与MSSQL配合使用效果非常 不错的(makesql在2ccc.com上有源码可下载,增加表内容较多时自动添加GO分隔, 以免执行时报内存不足的错误) 1.0.9 *修正被部分杀软报毒的问题; *修正停止服务时没有清除标识,造成提示无法运行相同实例的错误。 1.0.8 ^调整窗口关闭事件,用户必须用托盘区的右键菜单退出程序; +加入vista/win7的UAC签名,运行程序时会自动请求提权; +开启服务前自动验证下有没有相同的实例在运行。 1.0.7 +数据库页增加收缩数据库和清除日志文件内容的右键功能项; +增加版本号显示,优化部分代码; +增加启动前自检,缺少文件时会有提示。 1.0.6 *修正附加和恢复数据库时,逻辑名处理不正确的问题。 1.0.5 ^备份数据库时使用完整备份,不再自动使用增量备份; *修正部分错误,优化代码以提高处理速度。 1.0.4 +增加服务守护,在服务被异常终止时,自动开启服务。 1.0.3 *连接与防火墙,防火墙列表增加与减少时的空数据项错误; *修正托盘区无法激活主窗口的问题; +增加多实例启动支持(复制多份,设置不同的实例名和端口即可启动多个实例); ^运行日志调整为50行滚动提示,供参考。 1.0.2 *附加数据库,日志文件路径未修改的错误; ^数据库列表,数据和日志文件的路径显示为绝对路径; +计划任务,增加自动备份和执行SQL语句的功能。

62,244

社区成员

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

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

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

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