首页 文章

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

提问于
浏览
15

我从SQL Server数据库字段获取二进制数据,并在我的应用程序具有权限的目录中本地创建文档 . 但是我仍然得到 Headers 中指定的错误 . 我已尝试在网上发布了许多建议,包括在Stackoverflow上的帖子中提出的建议 . 我还使用了ProcessExplorer> Find 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 回答

  • 1

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

    using System.Threading;
    
    fs.Dispose();
    Thread.Sleep(3000);
    // Copy file
    
  • -1

    这就是我做的:

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

    然后在任何地方使用 stream 对象 .

  • 4

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

  • 3

    在执行复制之前,请尝试处理BinaryWriter对象 .

  • 3

    在处理完流后,尝试添加对 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

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

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

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

    EDIT :尝试通知 FileShare.Read 权限 .

  • 30

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


    从数据库中检索并使用正常编码将其保存为“temp.bmp”时,我使用Image在图片框中显示它,而不使用此代码时使用“using”关键字:

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

    它像一块蛋糕一样工作


    它确实有帮助

  • 0

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

相关问题