无法保存文件,因为它正在使用中

Posted

技术标签:

【中文标题】无法保存文件,因为它正在使用中【英文标题】:cannot save file because it's in use 【发布时间】:2017-04-28 16:44:24 【问题描述】:

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

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;
    

它仍然给我同样的错误。

【问题讨论】:

没什么大不了的,它只是说“该进程无法访问文件'path_to_file',因为它正在被另一个进程使用。” IOException: The process cannot access the file 'file path' because it is being used by another process的可能重复 发人深省...在我的环境中,我们正在运行一个备份软件,它基本上可以跟踪我的文件系统。创建新文件时,备份软件会启动并尝试几乎立即备份文件。我有一些实例,我的程序会创建一个文件,然后我会尝试在其中写一些东西,但它会被锁定,被另一个进程使用。原来我的备份软件会在我创建文件和我尝试在其中写一些东西之间的那一瞬间抓取文件。 您是否尝试过在 Process Explorer 中查看锁定它的原因? 请原谅我,我是个白痴。 :) 我在那里有另一个sn-p代码,我忘记了它正在执行从文件中获取BMP的属性,以及打开一个新的位图对象的那部分并且没有“使用”它周围.很抱歉给您带来了麻烦。 【参考方案1】:

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

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

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

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

更新:

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

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

看看你是否在上面的代码块中遇到过异常。如果你在它周围加上 try/catch,它可能会指出问题发生的原因..

【讨论】:

在我运行我的程序之前,该文件甚至不存在,我正在创建它。我知道“使用”对我来说做了所有这些,我只是为了绝对确定而添加了这些,因为我正在把头撞在墙上,试图弄清楚为什么这不能正常工作。我没有从那些额外的电话中得到错误。但是我已经删除了它们,第二次尝试时我仍然遇到同样的错误。 请看我上面的更新。也许 try/catch 可以阐明解决方案..

以上是关于无法保存文件,因为它正在使用中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ajax保存文件

无法加载或保存 txt。文件

如何保存到excel文件

如何在 spyder 中恢复未保存的文件

Photoshop Extendscript - 文件被锁定 - 无法保存

无法从 iPhone 文档目录位置中的已保存文件重新加载 UIImage