-1

我已经尝试了很多不同的方法来做到这一点,当我在再次保存之前尝试将其删除时,它仍然告诉我该文件正在使用中。

if (Clipboard.GetDataObject().GetData(DataFormats.Bitmap) != null)
{
    if (File.Exists(filename)) { File.Delete(filename); }
    using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite))
    {
        ImageConverter converter = new ImageConverter();
        byte[] bytes = (byte[])converter.ConvertTo(Clipboard.GetDataObject().GetData(DataFormats.Bitmap), typeof(byte[]));
        fs.Write(bytes, 0, bytes.Length);
        fs.Close();
        fs.Dispose();
    }
}

如您所见,我将所有内容都放在“使用”块中。我还“关闭”了该文件,甚至还尝试显式调用“处置”。但是当我再次运行代码时,它仍然告诉我文件正在使用中。我该怎么做才能覆盖文件?

我也试过这样:

using (Bitmap bmp = new Bitmap((Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap)))
{
    if (bmp != null)
    {
        if (File.Exists(filename)) { File.Delete(filename); }
        using (MemoryStream memory = new MemoryStream())
        {
            using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite))
            {
                bmp.Save(memory, ImageFormat.Bmp);
                byte[] bytes = memory.ToArray();
                fs.Write(bytes, 0, bytes.Length);
                fs.Close();
            }
            memory.Dispose();
        }
        bmp.Dispose();
        break;
    }
}

它仍然给我同样的错误。

4

1 回答 1

0

如果文件在您的程序运行之前已经被锁定,您将无法打开它。看看你是否可以使用像Unlocker这样的程序来解锁它。文件解锁后,您应该可以再次打开它。

将文件流包装到using{}语句中时,不需要close();and调用。当代码退出语句dispose();时,它们已为您完成。using{}打电话并没有什么坏处,close();但它是多余的。但是,如果您调用dispose();,并且 using 调用结束dispose();,您可能会收到异常,因为您正在调用dispose();已处置的对象。删除您对close();dispose();

如果您通过任务管理器(处理程序)在程序上“结束进程”,或者在程序在using{}块内循环时单击 IDE 内的“停止”按钮,它将再次锁定文件,您需要使用“解锁器”再次。

因此,删除您的close()dispose()调用,然后使用“解锁器”解锁文件。运行你的程序,你应该是金...

更新:

在以下代码周围放置一个 try/catch 块:

        bmp.Save(memory, ImageFormat.Bmp);
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);

看看你是否在上面的代码块中遇到过异常。如果您对其进行尝试/捕获,它可能会指出问题发生的原因..

于 2016-12-13T15:32:27.933 回答