C# FileSystemWatcher无法访问文件,因为其他进程正在使用该文件

C# FileSystemWatcher无法访问文件,因为其他进程正在使用该文件,c#,c,winforms,filesystemwatcher,C#,C,Winforms,Filesystemwatcher,这是我的情况。我还是个新手。我正在linux虚拟机中生成一些.txt文件,并在windows中使用c#winform应用程序将数据加载到图表中。大约有20个文件。我需要做的是加载第一个文件,将其显示在图表上,重新加载文件并将其显示在图表上,重新加载文件,将其显示在图表上,等等。我的c代码每次都用新值在同一个文件上写入。因此,在winforms中,当您查看图表时,您将看到在加载每个新数据集时数据的转换。这应该很快发生。一些新的数据被加载,但是我得到了另一个进程正在使用的文件的错误。我一直在读有关错

这是我的情况。我还是个新手。我正在linux虚拟机中生成一些.txt文件,并在windows中使用c#winform应用程序将数据加载到图表中。大约有20个文件。我需要做的是加载第一个文件,将其显示在图表上,重新加载文件并将其显示在图表上,重新加载文件,将其显示在图表上,等等。我的c代码每次都用新值在同一个文件上写入。因此,在winforms中,当您查看图表时,您将看到在加载每个新数据集时数据的转换。这应该很快发生。一些新的数据被加载,但是我得到了另一个进程正在使用的文件的错误。我一直在读有关错误的文章,但我想我仍然不知道如何修复它。我需要生成文件的c代码与c#图表加载代码对齐,以便顺利进行。在C语言中,我还收到一条错误消息,文件无法打开进行写入

这是我到目前为止试过的。我尝试在c代码中等待片刻,然后打开文件进行编写,但没有成功。我也尝试过反复打开文件,直到它打开时没有错误,但没有成功。我唯一能想到的另一个解决方案就是创建像1.txt 2.txt 3.txt这样的文件。。。然后依次加载它们。那可能是我必须走的路。但我还是个新手,不知道这样做是否是最好的开始

C代码

for(i = 0; i < FILES; i++){
    fd = fopen(path, "w+");
    if( fd == NULL ){
        printf( "Could not open file for writing. Exiting...\n");
        exit(-1);
    }
    for(j = 0; j < ROW; j++){
        fprintf(fd, "%.4f", vector[i][j]);
        fprintf(fd, "%s", "\n");
    }
    fclose(fd);
}   
for(i=0;i
C#代码

//定义事件处理程序。
私有void OnChanged(对象源、文件系统目标)
{
FinalList.Clear();
chart4.Series[0]。Points.Clear();
加载数据(FinalPath、FinalList、chart4);
}
私有void加载数据(字符串路径、列表、System.Windows.Forms.DataVisualization.Charting.Chart)
{
字符串行=null;
双值=0;
使用(TextReader=File.OpenText(路径))
{
line=reader.ReadLine();
while(行!=null)
{
值=System.Convert.ToDouble(行);
列表。添加(值);
line=reader.ReadLine();
}
}
对于(int i=0;i
我想使用(网络?)文件系统在不同平台之间进行进程间通信是一种不好的方式。如果继续这种方式,将出现同步问题。想象一下,此时文件只有一半是由C代码编写的。由于缓冲区已满,Linux系统可能会将此文件同步到磁盘。现在,您的windows C#应用程序读取该文件,但只能获取其中的一半。这不是您想要的,因为您的c#应用程序永远不会知道c程序何时完成了完整文件的编写

我建议您使用套接字在Linux和Windows之间传输数据


在linux方面,您可以使用非常便宜的套接字实现。您可以将数据写入例如
file.txt
,并使用
system
命令与netcat(ubuntu上的
nc
)一起发布文件

cat file.txt | nc -l 1234
我想你也可以下载netcat for windows。您可以这样获取文件(用Linux虚拟机的ip地址替换
1.2.3.4
):


确保您的windows可以访问Linux虚拟机。使用VirtualBox默认值(NAT),这是不可能的,但您可以轻松地更改它。

您可以从C程序访问Windows API函数吗?如果是这样,您可以使用CreateEvent()创建同步事件,并使用ManualResetEvent从C#程序访问同一事件。然后你可以在两个程序之间进行适当的同步。不,先生。我被Linux困住了谢谢你的建议。我要调查一下。我现在正在做一个实习,但是我的同事中没有一个是计算机科学专业的,所以我不能问任何问题。这绝对不是我们在我参加的任何课程中真正谈论的东西,但感谢上帝的互联网络。如果你打算继续在这一领域,一定要了解。这种廉价的netcat解决方案不是很好,而是一个起点<代码>nc stackoverflow.com 80
;)
cat file.txt | nc -l 1234
nc 1.2.3.4 1234 > file.txt