Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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#_Stream_Filestream_System.io.file - Fatal编程技术网

C# 读/写文件在多台计算机上执行多个进程

C# 读/写文件在多台计算机上执行多个进程,c#,stream,filestream,system.io.file,C#,Stream,Filestream,System.io.file,我有一个由多台计算机组成的网络,为了简单起见,有两台计算机,计算机a和计算机B。其中一台计算机a上有一个带有设置的文本文件。计算机上的一个进程应该在该文本文件中写入一些行。 计算机上的另一个进程应该监视文件的更改,当发生此类更改时,读取行中的内容。这里很重要的一点是,计算机上的过程可以确保文件已完全写入,并且不会读取半写行 我得到的是: ->对于Computer_B,哪一个进行写入: using (FileStream fileStream = new FileStream(@"file_on_

我有一个由多台计算机组成的网络,为了简单起见,有两台计算机,计算机a和计算机B。其中一台计算机a上有一个带有设置的文本文件。计算机上的一个进程应该在该文本文件中写入一些行。 计算机上的另一个进程应该监视文件的更改,当发生此类更改时,读取行中的内容。这里很重要的一点是,计算机上的过程可以确保文件已完全写入,并且不会读取半写行

我得到的是:

->对于Computer_B,哪一个进行写入:

using (FileStream fileStream = new FileStream(@"file_on_computer_A", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read))
    {
      using (StreamWriter WriteToFile = new System.IO.StreamWriter(fileStream))
      { 
         WriteToFile.WriteLine("setting one");
         WriteToFile.WriteLine("setting two");
         //...
      }
    }
->计算机使用
FileSystemWatcher
监视对文件的更改

        FSW = new FileSystemWatcher();
        FSW.Path = @"local_directory_path";
        FSW.Filter = "PLSanDM.txt";
        FSW.Changed += new FileSystemEventHandler(PLSanDM);
        FSW.EnableRaisingEvents = true;
至于当事件
FSW.Changed
触发时的读数本身:

 void PLSanDM(object sender, FileSystemEventArgs e)
    {
            using (FileStream fs = new FileStream(@"path_to_file", FileMode.Open, FileAccess.Read))
            {
                using (ReadFromFile = new System.IO.StreamReader(fs))
                {
                    List<string> linesInFile = new List<string>();
                    string line;
                    while ((line = ReadFromFile.ReadLine()) != null)
                    {
                        linesInFile.Add(line);
                    }
                    foreach (string s in linesInFile)
                    {
                      //do sth
                    }
                }
           }
    }
void PLSanDM(对象发送方,文件系统目标)
{
使用(FileStream fs=newfilestream(@“路径到文件”,FileMode.Open,FileAccess.Read))
{
使用(ReadFromFile=new System.IO.StreamReader(fs))
{
列表行文件=新列表();
弦线;
而((line=ReadFromFile.ReadLine())!=null)
{
linesInFile.Add(行);
}
foreach(行文件中的字符串s)
{
//做某事
}
}
}
}
但是,这会导致出现异常,说明文件当前正由另一个进程使用,无法打开

我做错了什么导致了异常?什么是正确的解决方案? 我需要做哪些更改以确保计算机A只能在计算机B完成写入后读取文件,而不是在写入过程中读取文件?

这里有一个关于GitHub的文件,可用于同步对共享资源的访问-您的情况下是一个文件。因此,当
计算机上的进程需要写入文件时,它将尝试获取锁,写入文件并释放锁。同时,
FileSystemWatcher
将通知
Computer\u a
上的进程该文件当前正在写入并尝试获取锁。如果失败,它可以重试,直到成功或超时。当它成功获取锁时,它可以安全地读取文件的内容


这种技术的优点是不依赖于某些操作系统特定的功能,如互斥锁或命名事件句柄。

@DarinDimitrov为什么不回答这个问题?因为重复的问题是关于单进程同步的,可以用
关键字轻松解决。这个问题涉及进程间同步,甚至更多:跨网络的进程间同步,这是一个更为不同(和困难)的问题。多线程、多进程和多机器同步之间有很大的区别。@Darin我的错,好像我用错了副本。无论如何,关于这一点有很多问题,相关的术语在我链接到的一个(共享读写锁)中。无论如何,OP,请分享你的研究成果。我到底应该分享什么?关于StackOverflow这个话题,确实有很多问题,我读了其中的大部分。我可以发布链接吗?它们中的大多数处理线程之间的同步,这很容易解决(如DarinDimitrov所述,使用布尔作为锁)。多进程通常可以通过使用类似的
EventWaitHandle
来解决。在一台机器上触发的事件不会被其他机器(自动)接收->多机器问题(据我所知是我的情况)。好吧,我链接到的问题是关于FileShare枚举的任务,它可以用来让多个进程同时访问同一个文件。这够了吗?例如,请参阅通过“c#读取正在使用的文件,由其他进程写入”找到的其他Q&A。我想首先问自己的问题是“我想依靠文件系统和SMB来实现这一点吗?”,但在您的案例中,这可能不适合讨论。