访问本地文件时,File.open会挂起并冻结线程

Tho*_*mas 8 c# file-io

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

FileStream sourceStream = File.Open(filePath, FileMode.Open)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

由于我现在已经没有想法可能的原因,我的问题是:这种意外行为的可能原因是什么,以及它们如何被广告?

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


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

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

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

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

TNX

Tho*_*mas 1

该问题并非源于 c# 或 Windows 系统,而是源于 PC 本身的设置架构。

在这种情况下,它的设置使得我尝试读取的文件可能无法访问(因为它们正在备份),而本地 PC 的操作系统不知道这一点。

因此,操作系统认为该文件是可访问的,并且 C# 在尝试打开该文件时收到了来自操作系统的答案。由于 C# 中的文件操作使用其 Windows 等效项,并且没有超时......整个操作挂起/冻结,直到文件备份完成。

回想起来,我会说:Lucas Trzesniewski 的答案应该涵盖大多数发生冻结的情况......我自己的问题没有得到解答,只是因为我有这样一个特殊情况最终导致了问题。