代码之家  ›  专栏  ›  技术社区  ›  Cragly

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

  •  15
  • Cragly  · 技术社区  · 16 年前

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

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

    我是不是遗漏了一些显而易见的东西?我是否正确地从数据库创建了文件?任何帮助解决或更好地诊断问题将不胜感激。

    // 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 回复  |  直到 16 年前
        1
  •  29
  •   Jesper Palm    16 年前

    尝试将呼叫添加到 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); 
    
        2
  •  4
  •   Mo Patel Mahdi Tahsildari    12 年前

    按如下所示更改代码,问题是在需要时没有对filestream进行垃圾收集:

        // 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);
    
        3
  •  3
  •   Rubens Farias    16 年前

    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 许可。

        4
  •  3
  •   Mo Patel Mahdi Tahsildari    12 年前

    我开始明白,尽管错误调试器说错误在于这段代码。。但这并不是错误所在。。 我遇到了一个类似的问题,我提出了这个解决方案。。考虑上面所有的帖子… 也许这对某人有帮助。。


    在从数据库检索并使用普通编码将其保存为“temp.bmp”后,我使用该图像在picturebox中显示它,而不使用“using”关键字。首先使用以下代码:

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

    它提出了一个错误,我真的没有得到错误的头尾。。所以我想出了这个解决办法。


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

    谈到filestream部分,我只使用了普通代码,如下所示:

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

    这就像是小菜一碟


        5
  •  1
  •   Bloodyaugust    16 年前

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

        6
  •  1
  •   Steve Danner    16 年前

    在进行复制之前,请尝试处理BinaryWriter对象。

        7
  •  1
  •   Mo Patel Mahdi Tahsildari    12 年前

    using System.Threading;
    
    fs.Dispose();
    Thread.Sleep(3000);
    // Copy file
    
        8
  •  0
  •   hakan    11 年前

    我就是这么做的:

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

    stream 无论你想去哪里都可以。

        9
  •  -1
  •   Jon Boy    9 年前

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