Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当文件被另一个进程打开时,文本阅读器为什么会抱怨?_C#_File_File Io - Fatal编程技术网

C# 当文件被另一个进程打开时,文本阅读器为什么会抱怨?

C# 当文件被另一个进程打开时,文本阅读器为什么会抱怨?,c#,file,file-io,C#,File,File Io,请参阅下面的简单单元测试示例 [Test] public void TextReaderRequiresWriteAccessToFile() { using (var reader = File.OpenText(Path.Combine(Folder, "Texts.txt"))) { } } 当我在编辑器中打开文本文件时,此测试失败。我希望通过file.OpenText以读取权限打开该文件 System.IO.IOException:进程无法访问该文件 'C:\*

请参阅下面的简单单元测试示例

[Test]
public void TextReaderRequiresWriteAccessToFile()
{
    using (var reader = File.OpenText(Path.Combine(Folder, "Texts.txt")))
    {
    }
}
当我在编辑器中打开文本文件时,此测试失败。我希望通过
file.OpenText
以读取权限打开该文件

System.IO.IOException:进程无法访问该文件 'C:\*文件夹的位置*\text.txt' 因为它正被另一个进程使用


NET需要额外权限才能通过此API打开文件进行读取,这有什么原因吗?

哦,但它只需要读取权限

问题是编辑器甚至阻止了读访问(在.NET中,这将是
FileShare.None
——默认的写访问)。如果在这两种情况下都使用
OpenText
打开文件,而不是使用编辑器,那么它就可以正常工作。因此,您可能需要一个不锁定文件的编辑器(例如,VisualStudio)


这不是.NET的问题-编辑器禁止您打开该文件进行阅读。您可能想了解一下共享文件访问的相关信息。

哦,但它只需要读取权限

问题是编辑器甚至阻止了读访问(在.NET中,这将是
FileShare.None
——默认的写访问)。如果在这两种情况下都使用
OpenText
打开文件,而不是使用编辑器,那么它就可以正常工作。因此,您可能需要一个不锁定文件的编辑器(例如,VisualStudio)


这不是.NET的问题-编辑器禁止您打开该文件进行阅读。您可能想了解一下共享文件访问。

当您的文件在文本编辑器中打开时,它有一个打开的句柄。这意味着,您需要使用
FileShare.Read
显式打开文件。这样,当文件已在其他地方以读/写模式打开时,您将获得读访问权限

using (var reader = File.OpenText(Path.Combine(Folder, "Texts.txt"), FileMode.Open, FileAccess.Read, FileShare.Read))
{
}

当您的文件在文本编辑器中打开时,它有一个打开的句柄。这意味着,您需要使用
FileShare.Read
显式打开文件。这样,当文件已在其他地方以读/写模式打开时,您将获得读访问权限

using (var reader = File.OpenText(Path.Combine(Folder, "Texts.txt"), FileMode.Open, FileAccess.Read, FileShare.Read))
{
}

啊,这就解释了。我完全看错方向了!谢谢你的回答!(因为实际的代码是在构建时执行的,并且会生成模糊的错误,所以我将把文件复制到另一个位置)。再次感谢!嗯,只是想知道。本例中的“其他”应用程序是Excel。为什么我的测试抱怨文件被另一个进程使用,而我只需在Excel中打开文件,然后在记事本中打开文件?如果记事本可以打开文件,那么我应该可以在我的程序中打开文件,对吗?@bas-Hah,是的,我有一半希望Excel会是一个,这也是我一直遇到的:)请按照Nico的建议尝试
FileShare.ReadWrite
,如果有人打开文件进行写入,这是绝对必要的-如果他们至少使用了
FileShare.Read
,那么它应该工作得很好(如果没有,你或多或少都是运气不佳)。记事本可能就是这么做的。如果这没有帮助,那么我猜记事本可能会使用阴影副本之类的东西,但似乎不太可能…:)。是的,我尝试了所有的
文件共享
组合,但运气不好。我去拿影印本。谢谢你的指导!(你和@NicoSchuele)遇到了同样的问题,并根据@Luaan的建议解决了。在我的应用程序中,它是一个日志文件(来自log4net)。记事本可以很好地打开,但其他使用
OpenText
的程序无法打开。我将
OpenText
调用更改为
newstreamreader(File.Open(path,FileAccess.Read,FileShare.ReadWrite),Encoding.UTF8)
,现在它可以正常打开了。我怀疑
OpenText
根本没有给open命令足够的权限。这就是原因。我完全看错方向了!谢谢你的回答!(因为实际的代码是在构建时执行的,并且会生成模糊的错误,所以我将把文件复制到另一个位置)。再次感谢!嗯,只是想知道。本例中的“其他”应用程序是Excel。为什么我的测试抱怨文件被另一个进程使用,而我只需在Excel中打开文件,然后在记事本中打开文件?如果记事本可以打开文件,那么我应该可以在我的程序中打开文件,对吗?@bas-Hah,是的,我有一半希望Excel会是一个,这也是我一直遇到的:)请按照Nico的建议尝试
FileShare.ReadWrite
,如果有人打开文件进行写入,这是绝对必要的-如果他们至少使用了
FileShare.Read
,那么它应该工作得很好(如果没有,你或多或少都是运气不佳)。记事本可能就是这么做的。如果这没有帮助,那么我猜记事本可能会使用阴影副本之类的东西,但似乎不太可能…:)。是的,我尝试了所有的
文件共享
组合,但运气不好。我去拿影印本。谢谢你的指导!(你和@NicoSchuele)遇到了同样的问题,并根据@Luaan的建议解决了。在我的应用程序中,它是一个日志文件(来自log4net)。记事本可以很好地打开,但其他使用
OpenText
的程序无法打开。我将
OpenText
调用更改为
newstreamreader(File.Open(path,FileAccess.Read,FileShare.ReadWrite),Encoding.UTF8)
,现在它可以正常打开了。我怀疑
OpenText
只是没有给open命令足够的权限。嗯,我从Luaan那里了解到,“另一个编辑器”应该用FileShare.Read打开文件。既然没有,我也无能为力。不管怎样,我试过你的建议,但似乎确实失败了,只有一个例外。在这种情况下,您只能希望“其他编辑器”不会以独占方式打开文件。不过,您可以尝试
FileShare.ReadWrite
,除非我弄错了,否则不接受
FileMode
FileAccess
FileShar