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

C# File.open在访问本地文件时挂起并冻结线程,c#,file-io,C#,File Io,我目前正在使用文件流将文件从一个位置复制到另一个位置。 直到现在,当我突然遇到一个问题时,File.open冻结了它运行的线程 FileStream sourceStream = File.Open(filePath, FileMode.Open) 它仅适用于1个特定文件(3 GB大小)。有趣的是,在它正常工作的前一天,虽然对于这个文件,它不能是文件大小。我检查的下一件事是,是否抛出了某种类型的异常,但我没有捕捉到 我在整个过程中放置了一个try/catch块(通常我使用调用方法捕获异常),但

我目前正在使用文件流将文件从一个位置复制到另一个位置。 直到现在,当我突然遇到一个问题时,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");
            }
我还检查了如果文件已经被访问会发生什么。然后抛出一个异常(对其他文件进行测试,就像我对这个特定文件所说的,当我试图打开它时,它总是挂断线程)

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

由于我现在不知道可能的原因是什么,我的问题是: 这种意外行为的可能原因是什么?如何宣传这些原因

编辑: 现在它又开始工作了(就在我试图使用进程监视器时,它又开始工作了)。 因此,完全不知道是什么导致了这种现象。如果有人知道这可能是什么原因的话,最好知道避免将来可能的问题重演


另外值得注意的是,有一个问题在文件之前提出。Open我有一个using block,其中包含:

using (var stream = new BufferedStream(File.OpenRead(filePath), 1024 * 1024))
{
   //..do calculations
}
我用它对文件进行一些散列计算。此文件在打开文件时没有任何问题(只有后面的文件.Open有问题)

编辑: 我刚刚从这里的系统管理员那里收到一条信息,它为问题带来了新的曙光: 系统的设置方式是,在操作系统不知道的情况下,对整个系统进行一次又一次的文件备份。这意味着在备份文件的情况下,操作系统认为它在那里,而实际上它当前正在备份,没有人访问它(因此,根据操作系统对备份过程的描述,可以从操作系统内部进行访问,但无法从操作系统内部进行访问….因为操作系统不知道备份发生了什么,在“资源硬盘访问”和“任务管理器”中均未显示任何内容)。 因此,有了这些信息,操作系统可能会因为不知道正在访问的文件而尝试访问它(通过open命令),并等待、等待、等待硬盘读取头访问该文件,但这从来没有发生过,因为实际上无法访问该文件)。 因此,它将不得不运行到file.open命令没有的超时(如果我准确地理解了那里的sys管理员,那么至少我对新信息的猜测是这样的)

tnx

您是否绝对确定冻结总是发生在
文件.Open()中

鉴于没有例外情况,似乎问题可能在较低级别。当您体验过它时,您尝试使用十六进制编辑器或其他工具打开该文件,以检查它是否完全可读?这可能是一个进入特定区域的问题​​硬盘

如果需要只读、只读等,请尝试使用
FileAccess
指定访问模式


有关BufferedStream的实际用途,请参见。

以下几个可能的原因:

  • 你的防病毒软件。这个东西挂接到操作系统中,用自己的I/O函数替换I/O函数。当您打开一个文件时,它实际上可以在将控制权返回到应用程序之前执行病毒检查。您可能有一个错误的签名更新,这迫使AV对您的3GB文件执行检查,随后的更新可能已修复该问题

  • 驱动器上的坏扇区。这通常会使I/O性能非常差,但您的系统可能已将坏扇区重新定位到另一个扇区,因此性能恢复正常。您可以运行
    chkdsk/R
    查看是否有坏扇区

  • 另一个锁定文件的应用程序,不过我更希望在这种情况下出现异常


是否已使用File.Open()函数检查FileAccess和FileShare值


我认为这是一个文件锁定问题。这个问题不是源于c#或Windows系统,而是源于电脑本身的结构

在本例中,它被设置为在本地PC的操作系统不知道的情况下,我试图读取的文件可能无法访问(因为它们正在备份)

因此,操作系统认为该文件是可访问的,而C#在试图打开该文件时收到了操作系统的回答。作为C#中的文件操作,使用它们的Windows AeEquivalent,而这些AeEquivalent没有超时。。。。整个操作被挂起/冻结,直到文件备份完成


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

这是不可能的:),但事实上,你可以用它来查看这个文件在被打开时到底发生了什么。你考虑过使用一个吗?在它发生之前,我还以为这是不可能的。如果我错过了一个try/catch,或者它一开始就不起作用,我本可以理解的一个异常(这也会很奇怪,但至少不是第一次它在第二天起作用,这个问题:)。我们来看看进程监视器tnx@john:bufferedstream仍需要文件。如果我没有弄错,是否打开?(问题是文件。Open本身已经挂断了)嗯,好的。我当时误解了.for the file.open:Yes 100%确定(我在运行调试器时尝试了几次,以确保我知道线程挂起的确切位置和发生的位置)。我打开了share.read文件。目前,我不能做任何事情