C# 进程无法访问文件'';因为它正被另一个进程使用

C# 进程无法访问文件'';因为它正被另一个进程使用,c#,C#,我搜索了很多关于这个异常的解决方案,但没有任何结果。 这是我的密码, 正在以下行中引发异常: BinaryWriter BW = new BinaryWriter(FI.Open(FileMode.Open)); 请注意,并非每次都会引发异常。。我知道这很奇怪。 有人有主意吗 FileInfo FI = new FileInfo("e:\\cc.accdb"); if (FI.Exists) FI.Delete(); GC.Collect();

我搜索了很多关于这个异常的解决方案,但没有任何结果。 这是我的密码, 正在以下行中引发异常:

 BinaryWriter BW = new BinaryWriter(FI.Open(FileMode.Open));
请注意,并非每次都会引发异常。。我知道这很奇怪。 有人有主意吗

    FileInfo FI = new FileInfo("e:\\cc.accdb");
    if (FI.Exists)
        FI.Delete();

    GC.Collect();

    FI.Create();

    byte[] bb = { 54, 87, 98, 57, 65 };
    BinaryWriter BW = new BinaryWriter(FI.Open(FileMode.Open));
    BW.Write(bb);

我猜是因为你没有关闭文件的句柄。处理完句柄后需要释放它,否则它会一直存在。使用块将Writer对象包装在一个
中,以便在完成此操作时将其处理掉

如果不是您的应用程序在该文件上有句柄,请运行procmon查看哪个进程在该特定文件上有锁


是下载Process Monitor的链接,以防您没有它。这是一个非常宝贵的工具,如果您不需要它,您将需要它。

如果您将代码更改为类似的内容,它将工作:

string path = "e:\\cc.accdb";

byte[] bb = { 54, 87, 98, 57, 65 };
BinaryWriter BW = new BinaryWriter(File.Open(path, FileMode.Create));
BW.Write(bb);

FileInfo.Create
返回
FileStream
对象。你忽视了这一点。大概是那个物体把你锁在外面了。为什么不直接将
FI.Create()
传递给您的
BinaryWriter
?GC.Collect()的作用是什么。这似乎毫无意义。你应该先用
块将编写器包装在一个
中,然后在关闭之前将其清除掉,以确定是否正确。@JeremyHolovcs同意,这是一个很好的利用点。我已经编辑了我的答案以供思考。另一个有用的程序是Unlocker。处理锁定文件非常方便。@PatrickPitre刚下载了它,看起来很酷。谢谢它还集成到资源管理器中,所以您可以右键单击任何文件,然后从那里运行Unlocker。很高兴你喜欢它!