c# – File.open在访问本地文件时挂起并冻结线程

我目前正在使用文件流将文件从一个位置复制到另一个位置.
直到现在,当我突然遇到File.open冻结正在运行的线程的问题时,这一切都按预期运行.

FileStream sourceStream = File.Open(filePath, FileMode.Open)

它仅适用于1个特定文件(大小为3 GB).有趣的是前一天它正常运行虽然对于这个文件,所以它不能是文件大小.我检查的下一件事是,如果抛出一些我没有抓到的异常.

我把一个try / catch块放在整个东西上(通常我使用调用方法来捕获异常)并且仍然具有相同的效果.

            try
            {
                FileStream sourceStream = File.Open(filePath, FileMode.Open);
                sourceStream.Close();
            }
            catch (Exception e)
            {
                Console.Write("A");
            }

我还检查了如果已经访问该文件会发生什么.然后抛出异常(对其他文件进行测试,就像我对这个特定文件说的那样,当我尝试打开它时,它总是挂起线程).

该文件位于本地硬盘驱动器上,同一文件夹中的其他文件(虽然较小)不显示此问题.

由于我现在已经没有想法可能的原因,我的问题是:
这种意外行为的可能原因是什么?如何宣传?

编辑:
它现在再次起作用(就在我尝试使用过程监视器时,它再次开始运行).
所以完全没有任何线索可能导致这种现象.如果有人知道这可能是什么原因,那么最好避免将来可能重复出现问题.

另外值得注意的是,在File.Open之前提出了一个问题我有一个使用块:

using (var stream = new BufferedStream(File.OpenRead(filePath), 1024 * 1024))
{
   //..do calculations
}

我用它来做一些关于文件的哈希计算.打开文件时没有任何问题(只有后来的File.Open有问题)

编辑:
我刚刚收到了来自系统管理员的信息,这些信息为问题提供了新的亮点:
系统的设置方式使得整个系统可以一次又一次地备份,而不需要知道它的操作系统.这意味着在备份文件的情况下操作系统认为它在那里并且没有人访问它,而实际上它当前正在备份(因此根据它们描述备份过程的方式访问并且无法从OS内访问它. ….由于操作系统不知道备份发生,资源硬盘访问和任务管理器中都没有显示.
因此,根据该信息,可能是因为操作系统不知道正在访问的文件,它试图访问它(通过打开命令)并等待并等待硬盘驱动器读头来到文件,这从未发生过它实际上无法访问).
因此,它必须遇到file.open命令没有的超时(如果我在那里准确地理解了sys管理员的话,至少我猜有新的信息)

TNX

最佳答案
有几个可能的原因:

>您的防病毒软件.那个东西挂钩到OS并用自己的I / O函数替换它.当您打开文件时,它实际上可以在将控制权返回给您的应用程序之前执行病毒检查.您可能有一个错误的签名更新,迫使AV对您的3GB文件执行检查,后续更新可以解决问题.
>您的驱动器上的坏扇区.这通常会使I / O执行得非常糟糕,但您的系统可能已将坏扇区重新定位到另一个扇区,因此性能恢复正常.您可以运行chkdsk / R来查看是否有坏扇区.
>另一个锁定文件的应用程序,但在这种情况下我宁愿期待异常.

转载注明原文:c# – File.open在访问本地文件时挂起并冻结线程 - 代码日志