【问题标题】:FileSystemWatcher cannot access file because its being used by another processFileSystemWatcher 无法访问文件,因为它正被另一个进程使用
【发布时间】:2013-03-23 19:31:41
【问题描述】:

这是我的情况。我对此还是很陌生。我正在我的 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]);

        }
    }

【问题讨论】:

  • 您可以从 C 程序访问 Windows API 函数吗?如果是这样,您可以使用 CreateEvent() 创建同步事件,并使用 ManualResetEvent 从 C# 程序访问相同的事件。然后您可以在程序之间进行适当的同步。
  • 不,先生。我被 linux 困住了

标签: c# c winforms filesystemwatcher


【解决方案1】:

我猜想使用(网络?)文件系统在不同平台之间进行进程间通信是一种糟糕的方式。如果继续这种方式,您将遇到同步问题。试想一下,此刻文件仅由 C 代码编写了一半。由于缓冲区已满,Linux 系统可能会将此文件同步到磁盘。现在您的 Windows C# 应用程序读取该文件,但只会得到它的一半。这不是您想要的,因为您的 c# 应用程序永远不会知道 C 程序何时完成了 complete 文件的编写。

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


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

cat file.txt | nc -l 1234

我好像你也可以下载 netcat for windows。您可以像这样获取您的文件(将1.2.3.4 替换为您的 Linux VM 的 IP 地址):

nc 1.2.3.4 1234 > file.txt

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

【讨论】:

  • 感谢您的建议。我要调查一下。我现在正在实习,但和我一起工作的人都不是计算机科学专业的,所以我真的不能问任何问题。这绝对不是我们在我上过的任何课程中真正谈论过的东西,但感谢上帝的互联网。
  • 如果您打算继续从事该领域的工作,请务必了解sockets。这个便宜的 netcat 解决方案不是很好,但有一些起点。 nc stackoverflow.com 80 ;)
猜你喜欢
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多