该进程无法访问该文件,因为该文件正由另一个进程使用

时间:2010-02-08 21:45:05

标签: c# asp.net

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

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

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

我错过了一些完全明显的东西吗?我是否正确地从数据库创建文件?任何有关解决或更好地诊断问题的帮助都将非常感激。

// 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);

9 个答案:

答案 0 :(得分:29)

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

// 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); 

答案 1 :(得分:4)

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

    // 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);

答案 2 :(得分:3)

using怎么样?

string source = @"C:\myTempDirectory\myFile.doc";
using(FileStream fs = new FileStream(
    source, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read))
{
    BinaryWriter br = new BinaryWriter(fs);
    br.Write("BinaryDataFromDB");
}

File.Copy(sourceFileName, destinationFilename, true);

编辑:尝试通知FileShare.Read权限。

答案 3 :(得分:3)

我开始明白,虽然错误调试器说错误在于此代码..但这不是错误所在的位置。 我遇到了类似的问题,我带来了这个解决方案..考虑上面的所有帖子.. 可能对某人有所帮助..


我使用Image在从数据库中检索并将其保存为" temp.bmp"后将其显示在图片框中使用正常编码而不使用"使用"首先使用此代码的关键字:

PictureBox1.Image = Image.FromFile("temp.bmp");

它引起了错误,我真的没有得到错误的头尾......所以我提出了这个解决方案。


不要直接分配,而是尝试以下代码:

Bitmap img;
using (Bitmap bmp = new Bitmap("temp.bmp"))
{
    img = new Bitmap(bmp);
}
pictureBox1.Image = img;

来到文件流部分我刚才使用了普通代码,如下所示:

FileStream fs = new FileStream("filepath",FileMode.Create);

它像一块蛋糕一样工作


真的有帮助

答案 4 :(得分:1)

是不是可以同时使用Filestream和BinaryWriter?例如,不能在同一文件上同时调用streamwriter和streamreader。但是,据我所知,这没有意义,在这种情况下不应该这样。也许尝试关闭br?

答案 5 :(得分:1)

在执行复制之前尝试处理BinaryWriter对象。

答案 6 :(得分:1)

是否有后台进程(如防病毒或文件系统索引)锁定文件的时间足够长,导致应用程序出现问题?尝试暂停3秒钟以查看问题是否消失。

using System.Threading;

fs.Dispose();
Thread.Sleep(3000);
// Copy file

答案 7 :(得分:0)

这就是我所做的:

Stream stream = new MemoryStream();
var tempStream = new FileStream(pathToFile, FileMode.Open);
tempStream.CopyTo(stream);
tempStream.Close();

然后在任意位置使用stream对象。

答案 8 :(得分:-1)

我发布申请后似乎才遇到这个问题。如果您关闭消息框并再次尝试调试,则不会发生任何事情。 MS Help表示要完全退出Visual Studio并重新启动它。它更容易调出任务管理器并结束这个过程。其名称将是解决方案名称,后跟“.vshost”(例如项目名称:PLC.sln;进程名称:PLC.vshost.exe)。该过程将自动重启。在Windows 7中,通常可以在结束进程时看到某些事情发生。但是在10中,任务管理器窗口很少改变。 我在更改代码后尝试测试程序时收到此消息。显然,当停止调试时,.exe不会关闭,当VS尝试编写新编译的exe文件时,会发生错误。我有时必须结束该过程两次以防止错误消息返回。 (我必须两次遇到错误;结束两次进程然后重新运行没有帮助。) 这是Visual Studio中的一个错误。