FileSystemWatcher无法访问文件,因为它正由另一个进程使用

时间:2013-03-23 19:31:42

标签: c# c winforms filesystemwatcher

在这里我的情况。我还是很陌生。我在我的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);
}   

C#代码

// Define the event handlers. 
private void OnChanged(object source, FileSystemEventArgs e)
{
    FinalList.Clear();
    chart4.Series[0].Points.Clear();
    loadData(FinalPath, FinalList, chart4);
 }

private void loadData(String path, List<double> list, System.Windows.Forms.DataVisualization.Charting.Chart chart)
{
    string line = null;
    double value = 0;        
    using (TextReader reader = File.OpenText(path))
    {
        line = reader.ReadLine();
        while (line != null)
        {
                value = System.Convert.ToDouble(line);
                list.Add(value);
                line = reader.ReadLine();
            }
        }

        for (int i = 0; i < ROW; i++)
        {
            chart.Series["Graph"].Points.AddXY(i + 1, list[i]);

        }
    }

1 个答案:

答案 0 :(得分:2)

我想使用(网络?)文件系统是在不同平台之间进行进程间通信的不好方法。如果继续这样,您将遇到同步问题。试想一下,目前的文件只有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 VM的IP地址替换1.2.3.4):

nc 1.2.3.4 1234 > file.txt

确保您的Windows可以访问Linux VM。使用VirtualBox默认network mode(NAT),这是不可能的,但您可以轻松更改它。