首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >该进程无法访问该文件,因为其他进程正在使用该文件

该进程无法访问该文件,因为其他进程正在使用该文件
EN

Stack Overflow用户
提问于 2010-02-09 05:45:05
回答 7查看 86K关注 0票数 16

我从SQL Server数据库字段获取二进制数据,并在我的应用程序有权限的目录中本地创建文档。然而,我仍然得到标题中指定的错误。我尝试了许多网上发布的建议,包括Stackoverflow上之前的帖子中提出的建议。我还使用了ProcessExplorer > Find Handle来定位锁,它没有返回任何内容,就好像文件没有被锁定一样。

我使用下面的代码将文件保存到文件系统,然后尝试在稍后的应用程序过程中使用另一种方法将该文件复制到新位置。此copy方法采用抛出异常的新创建文件的路径。

文件本身是用它的内容创建的,我可以通过Windows资源管理器打开它,没有任何问题。

我是不是漏掉了什么很明显的东西?我是否从数据库中正确地创建了文件?在解决或更好地诊断问题方面的任何帮助都将不胜感激。

代码语言:javascript
复制
// Get file from DB
FileStream fs = new FileStream(
    "C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write);
BinaryWriter br = new BinaryWriter(fs);
br.Write("BinaryDataFromDB");
fs.Flush();
fs.Close();
fs.Dispose();

// Copy file
File.Copy(sourceFileName, destinationFilename, true);
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-09 06:20:38

在处理完流之后,尝试添加对GC.Collect()的调用,以强制垃圾收集器进行清理。

代码语言:javascript
复制
// Get file from DB 
using(FileStream fs = new FileStream("C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write)) 
using(BinaryWriter br = new BinaryWriter(fs))
{
   br.Write("BinaryDataFromDB"); 
   fs.Flush(); 
}

//Force clean up
GC.Collect();

// Copy file 
File.Copy(sourceFileName, destinationFilename, true); 
票数 29
EN

Stack Overflow用户

发布于 2010-02-09 06:10:36

如下所示更改您的代码,问题是当您需要文件流时,它不会被垃圾收集:

代码语言:javascript
复制
    // Get file from DB 
using (FileStream fs = new FileStream("C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write)) 
{
    BinaryWriter br = new BinaryWriter(fs); 
    br.Write("BinaryDataFromDB"); 
    fs.Flush(); 
    fs.Close(); 
}

// Copy file 
File.Copy(sourceFileName, destinationFilename, true);
票数 4
EN

Stack Overflow用户

发布于 2010-02-09 05:51:49

是不是文件流和BinaryWriter不能同时使用?例如,在同一文件上不能同时调用流编写器和流阅读器。然而,这是没有意义的,据我所知,在这种情况下是不应该的。也许也可以试着关闭br?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2225087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档