C# 在使用System.IO.file.WriteAllText()方法创建/修改文件时,是否可以读取锁定文件?

C# 在使用System.IO.file.WriteAllText()方法创建/修改文件时,是否可以读取锁定文件?,c#,asp.net,.net,biztalk,streamwriter,C#,Asp.net,.net,Biztalk,Streamwriter,我需要创建一个进程来创建/修改文件夹中的一些文本文件。我正在使用以下代码来完成此操作: file = new System.IO.FileInfo(filePath); file.Directory.Create(); System.IO.File.WriteAllText(file.FullName, "Some text..."); 我有一个Biztalk队列,它每2分钟查看一次文件夹中的文本文件,并拾取文件进行处理。我希望在创建/修改文件时锁定这些文件,以便Biztalk不会尝试处理这

我需要创建一个进程来创建/修改文件夹中的一些文本文件。我正在使用以下代码来完成此操作:

file = new System.IO.FileInfo(filePath);
file.Directory.Create(); 
System.IO.File.WriteAllText(file.FullName, "Some text...");
我有一个Biztalk队列,它每2分钟查看一次文件夹中的文本文件,并拾取文件进行处理。我希望在创建/修改文件时锁定这些文件,以便Biztalk不会尝试处理这些文件。我怎样才能做到这一点


我读过有关windows中的事务性NTFS的文章,该文件允许我创建事务上下文,但windows文档说明此功能将被弃用,建议不要使用它。

要获得独占锁,可以使用文件流来实现

        using (FileStream fs = new FileStream("Test.txt", FileMode.Append, FileAccess.Write, FileShare.None))
        {
            using (StreamWriter sw = new StreamWriter(fs))
            {
                sw.WriteLine("test");
            }
        }

通过这种方式,您只为当前文件流锁定文件。操作系统将拒绝来自同一应用程序内另一个线程的任何其他应用程序,甚至是文件流的新实例尝试读取或写入该文件

要获取独占锁,可以使用文件流来获取

        using (FileStream fs = new FileStream("Test.txt", FileMode.Append, FileAccess.Write, FileShare.None))
        {
            using (StreamWriter sw = new StreamWriter(fs))
            {
                sw.WriteLine("test");
            }
        }

通过这种方式,您只为当前文件流锁定文件。操作系统将拒绝来自同一应用程序内另一个线程的任何其他应用程序,甚至是文件流的新实例尝试读取或写入该文件

如果文件位于CIFS共享的本地NTFS卷上,则文件适配器不会尝试读取打开的文件。但是,


更好的模式是在临时文件夹中执行文件工作,然后仅在完成文件后将其复制到BizTalk文件夹。这样,您根本不必担心锁定问题。

如果文件位于CIFS共享的本地NTFS卷上,文件适配器将不会尝试读取打开的文件。但是,


更好的模式是在临时文件夹中执行文件工作,然后仅在完成文件后将其复制到BizTalk文件夹。这样,您就不必担心锁定问题了。

在大多数情况下,使用不同的扩展名编写文件,然后重命名文件就可以了。

在大多数情况下,使用不同的扩展名编写文件,然后重命名文件就可以了。

史蒂夫,我尝试创建一个巨大的文件,并在文件仍在编写时尝试在记事本中打开它,我能打开它。这不意味着Biztalk也应该能够读取吗?Steve,我尝试创建一个巨大的文件,并尝试在记事本中打开它。当文件仍在写入时,我能够打开它。这难道不意味着Biztalk也应该能够读取吗?Jhons,这是一个很好的解决方案,但这意味着我必须编写另一个组件,这会增加复杂性,因此使用Steve的选项。@Nitheesh Ok,但我的选项更常见;)为什么不能在处理完文件后,在同一个过程中复制它?我确实预测依赖锁会导致问题。我必须每秒写入500个大小为700kb-1mb的文件,我认为将它们写入一个位置并复制它们会影响应用程序的性能。@Nitheesh使用移动而不是复制,如果它在同一个驱动器上,它会更新目录项。另一个选项是使用临时文件名(与BizTalk所需的文件不匹配)并在完成写入后重命名该文件。@Nitheesh不必担心“性能”,除非您能证明需要这样做。注重可靠性和可维护性。性能将不是你的问题。Jhons,这是一个很好的解决方案,但这意味着我必须编写另一个组件,这会增加复杂性,因此使用Steve的选项。@Nitheesh Ok,但我的选项更常见;)为什么不能在处理完文件后,在同一个过程中复制它?我确实预测依赖锁会导致问题。我必须每秒写入500个大小为700kb-1mb的文件,我认为将它们写入一个位置并复制它们会影响应用程序的性能。@Nitheesh使用移动而不是复制,如果它在同一个驱动器上,它会更新目录项。另一个选项是使用临时文件名(与BizTalk所需的文件不匹配)并在完成写入后重命名该文件。@Nitheesh不必担心“性能”,除非您能证明需要这样做。注重可靠性和可维护性。性能不是你的问题。