【问题标题】:overwrite files (image) and delete image in c#?在c#中覆盖文件(图像)并删除图像?
【发布时间】:2011-02-01 09:28:19
【问题描述】:

我有一个简单的表单,用户可以使用它来上传图片。它有一个预览按钮,因此当用户选择图像并单击预览时,会发生回发,我将图像保存到临时文件夹并调整其大小并将其显示在页面上。从那里,用户可以submit formedit 表单。如果他提交,一切正常,我将调整大小的图像复制到正确的文件夹中。

如果他点击编辑,并选择另一张图片,我需要删除上传的文件(原始文件和调整大小的文件),如果我这样做:

File.Delete(HostingEnvironment.MapPath(TmpDirectory + PostImageName + ".jpg"));
File.Delete(HostingEnvironment.MapPath(TmpDirectory + PostImageName + "_small_.jpg"));

我收到一个异常,说其他进程正在使用该图像并且它无法删除。 (即使在回发之后!)

另外,如果我没有删除该文件,而是尝试用相同的名称保存新图像以便它会覆盖,它仍然会抛出错误,因为文件已经存在。

用户可以编辑/预览的次数没有限制,所以我不能增量保存文件(这样做甚至没有意义)

此外,在回发之后,当用户返回编辑模式并查看表单时,文件上传控件为空。如何让文件上传控件保留该值?所有其他文本框、文本区域和复选框都正常运行。

总结这些是我的问题:

1) 我到底如何(或者更确切地说,在 c# 中)删除文件而不出现该异常?

1)如何覆盖文件?
2) 如何使文件上传控件在回发之间保持其值。

谢谢。

【问题讨论】:

    标签: c# image file-upload


    【解决方案1】:

    异常说明:您的文件仍在被您启动的另一个进程(即线程)使用/打开。我敢打赌,这是您打开图像文件进行阅读的过程。确保你已经关闭了相关的流,十块钱它会解决你的问题。

    【讨论】:

    • 这里是它的保存方式:``Bitmap img = new Bitmap(HostingEnvironment.MapPath(TmpDirectory + PostImageName + "_big.jpg"));``那么我该如何关闭它呢?!
    • 我的意思是,这就是它的打开方式。它通过upImage.SaveAs(...)的文件上传控制保存@
    【解决方案2】:

    为什么在服务器端使用位图打开文件?您应该简单地使用

    流式传输“文件”

    Response.TransmitFile(physicalFileNameAndPath)。

    TransmitFile 需要(作为字符串)物理文件路径和名称。

    问题源于您将文件发送给客户端的方式。该文件仍被上一步“锁定”。如果您解决此问题,您将能够在需要时删除该文件。

    我没有使用 FileUpload 控件,但看起来您正在使用 ViewState(这有助于在回发后保留字段中的值。FileUpload 控件不支持 ViewState 或者您没有将其配置为使用 ViewState。

    您可以为 FileUpload 控件的所需属性分配正确的“值”,以便它显示您所期望的。这意味着您必须在发布表单时捕获所述值,并在 DataBind 期间简单地将值重新分配回 FileUpload 控件的属性。

    【讨论】:

    • 您好,我需要使用位图打开图像以调整其大小,然后再次保存,以便将其分配给预览图像。然后,我需要将调整大小的图像保存在主目录中,删除临时文件夹中的所有文件。
    • 您是否正在处理您的位图实例?你能展示你用来调整大小的代码吗?问题出在以下领域之一。 1 - 保存上传文件的方式。 2 - 打开它以重新调整大小的方式。 3- 保存调整大小的图像文件的方式。
    • 显然,从服务器将文件作为位图打开会在该文件上创建一个锁定。尝试通过将文件作为文件流打开、“制作”位图并在编辑后关闭文件流来解决此问题。
    • 我喜欢 Mika :3 everybody's gonna love today, gonna love today, gonna love todayshould I look older? should I bend over just to be put on your shelf :D 但我使用了 dispose 方法,它有效,谢谢!!现在来处理上传控件不记得回发时的图像路径
    • @IrishBelly,第二个问题的结果是什么?
    【解决方案3】:
    1. 确保您当前的 进程没有写句柄 打开有问题的文件
    2. 如果没有句柄,请尝试 关闭病毒扫描程序;一个 过于激进的病毒扫描程序 可能会锁定那些 文件刚刚创建后。这可能会阻止您删除文件。

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多