Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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-进程无法访问文件,因为另一个进程正在使用该文件_C#_Xml_.net - Fatal编程技术网

C# c-进程无法访问文件,因为另一个进程正在使用该文件

C# c-进程无法访问文件,因为另一个进程正在使用该文件,c#,xml,.net,C#,Xml,.net,这是一个场景, 我有一个应用程序,每2秒覆盖一个xml文件。 然后我有一个c应用程序,它每1-2秒读取一次这个文件。 这个过程运行得很好,但有时我会收到错误信息 进程无法访问文件,因为另一个进程正在使用该文件 我正在使用xmldocument.load打开并读取xml文件 我能做些什么来解决这个问题? 我试过在不同的机器上运行,这绝对是随机的,因为在我的机器上,它在出错之前在另一台机器上运行了6个小时 因为我的c程序将继续读取此文件,除非用户单击按钮停止数据记录过程 因为我希望程序继续运行,只要

这是一个场景, 我有一个应用程序,每2秒覆盖一个xml文件。 然后我有一个c应用程序,它每1-2秒读取一次这个文件。 这个过程运行得很好,但有时我会收到错误信息

进程无法访问文件,因为另一个进程正在使用该文件

我正在使用xmldocument.load打开并读取xml文件

我能做些什么来解决这个问题? 我试过在不同的机器上运行,这绝对是随机的,因为在我的机器上,它在出错之前在另一台机器上运行了6个小时

因为我的c程序将继续读取此文件,除非用户单击按钮停止数据记录过程

因为我希望程序继续运行,只要用户不停止它。
请帮助

当另一个应用程序写入同一个文件时,您无法读取该文件,如果您开发了这两个应用程序,我建议使用real database而不是XML文件。请原谅


但若你们不想使用xml文件,你们可以捕捉XmlDocument.Load抛出的异常,并再次尝试读取,希望其他过程是通过写入来完成的,当另一个应用程序写入同一个文件时,你们不能从文件中读取,若你们开发了这两个应用程序,我建议使用real database代替xml文件。请原谅


但是,如果您不想使用xml文件,您可以捕获XmlDocument.Load引发的异常,并尝试再次读取,希望其他进程通过写入完成。该文件可能仍被您的操作系统标记为正在使用,或者被其他计算机标记为正在使用,或者有时被病毒扫描程序标记为正在使用,并且释放速度不够快,无法用于您的程序。您应该插入一个小的超时/延迟,或者使用try捕获异常。。捕获文件,并在稍有延迟后重试。

该文件可能仍被您的操作系统标记为正在使用、被其他计算机标记为正在使用,或者有时被病毒扫描程序标记为正在使用,并且释放速度不够快,无法满足您的程序的需要。您应该插入一个小的超时/延迟,或者使用try捕获异常。。捕获并再次在小延迟后重试。

当您使用计时器时,您应该在处理文件时停止计时器,直到完成:

private void timer_Tick(object sender, EventArgs e)
{
  try
  {
    timer.Stop();
    //read write whatever ...
  }
  catch(){}  
  timer.start(); 
}

使用计时器时,应在处理文件时停止计时器,直到完成:

private void timer_Tick(object sender, EventArgs e)
{
  try
  {
    timer.Stop();
    //read write whatever ...
  }
  catch(){}  
  timer.start(); 
}

要避免冲突,请按如下方式进行覆盖:

将新XML写入与旧XML相同位置的临时文件 将新文件重命名为旧文件
在UNIX文件系统上,这将避免在写入过程中读取尝试失败的问题。不确定windows是否可用,但应该可以使用。

为避免冲突,请按如下方式进行覆盖:

将新XML写入与旧XML相同位置的临时文件 将新文件重命名为旧文件
在UNIX文件系统上,这将避免在写入过程中读取尝试失败的问题。不确定windows是否可用,但应能正常工作。

请告诉我,您是否尝试过使用变量读取内容,该变量使用适当的and和参数进行实例化,并使用特殊指定的参数。您可以使用方法的实现来加载XmlDocument的内容,该方法采用适当的Opened for write,并将versa filestream的读取访问份额作为参数

请尝试使用以下代码写入文件:

XmlDocument xmlDocument = new XmlDocument();
using (FileStream fileStream = new FileStream("C:\\test.xml", FileMode.Append, FileAccess.Write, FileShare.Read))
{
    xmlDocument.Load(fileStream);
}
以及以下用于从文件读取的代码:

XmlDocument xmlDocument = new XmlDocument();
int attempts = 5;
Exception cannotReadException = null;
while (attempts > 0)
{
    try
    {
        using (FileStream fileStream = new FileStream("C:\\test.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            xmlDocument.Load(fileStream);
            attempts = 0;
        }
    }
    catch (Exception exception)
    {
        cannotReadException = exception;
        System.Threading.Thread.Sleep(100);
        attempts--;
    }
}

if (cannotReadException != null)
{
    throw cannotReadException;
}

请告诉我您是否尝试过使用变量读取内容,该变量使用适当的and和参数实例化,并使用特殊指定的参数。您可以使用方法的实现来加载XmlDocument的内容,该方法采用适当的Opened for write,并将versa filestream的读取访问份额作为参数

请尝试使用以下代码写入文件:

XmlDocument xmlDocument = new XmlDocument();
using (FileStream fileStream = new FileStream("C:\\test.xml", FileMode.Append, FileAccess.Write, FileShare.Read))
{
    xmlDocument.Load(fileStream);
}
以及以下用于从文件读取的代码:

XmlDocument xmlDocument = new XmlDocument();
int attempts = 5;
Exception cannotReadException = null;
while (attempts > 0)
{
    try
    {
        using (FileStream fileStream = new FileStream("C:\\test.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            xmlDocument.Load(fileStream);
            attempts = 0;
        }
    }
    catch (Exception exception)
    {
        cannotReadException = exception;
        System.Threading.Thread.Sleep(100);
        attempts--;
    }
}

if (cannotReadException != null)
{
    throw cannotReadException;
}

为了扩展其他人的建议,下面是一个示例,说明如何使用try-catch块实现以解决冲突:

private XmlDocument OpenXML(string filename, int retryCount = 0)
{
    XmlDocument retval = new XmlDocument();

    try
    {
        retval.Load(filename);
    }
    catch
    {
        if (retryCount < 5)
        {
            retval = OpenXML(filename, retryCount + 1);
        }
        else
        {
            return null;
        }
    }

    return retval;
}

在catch中,如果需要,您可以添加暂停,或者增加重试尝试次数/在达到最大尝试次数时以不同方式处理。

要扩展其他人的建议,下面是一个使用try-catch块解决冲突的示例:

private XmlDocument OpenXML(string filename, int retryCount = 0)
{
    XmlDocument retval = new XmlDocument();

    try
    {
        retval.Load(filename);
    }
    catch
    {
        if (retryCount < 5)
        {
            retval = OpenXML(filename, retryCount + 1);
        }
        else
        {
            return null;
        }
    }

    return retval;
}

在catch中,如果需要,您可以添加暂停,或者增加重试次数/在达到最大尝试次数时以不同方式处理。

如前所述,您可以实施简单的等待x毫秒重试方法


如果您在Windows上,并且可以访问这两个程序的源代码,则可以使用本机Win32函数创建一个信号量来调节对文件的访问。有关更多详细信息,请参见第页。

如前所述,您可以实现一种简单的等待x毫秒重试方法

如果您在Windows上,并且可以访问这两个程序的源代码,则可以使用本机Win32函数创建
使用一个信号量来控制对文件的访问。有关详细信息,请参见第页。

其他流程是什么?我们从这里看不到它。睡眠,然后再试一次,我想。我是写文件的应用程序,问题是??你每秒都在读你自己的文件?这是某种硬盘耐久性测试吗?显示您正在正确处理编写器的Post代码。如果您这样做是为了在两个应用程序之间通信,那么这是错误的。有许多更好的方法可以将信息从一个应用程序发送到另一个应用程序:WPF或旧.NET版本中的远程处理,普通套接字,等等。使用文件进行通信是一个错误的想法。我正在考虑将其转换为使用套接字。。但不幸的是,消息来源肯定会使用这种方法。另一个过程是什么?我们从这里看不到它。睡眠,然后再试一次,我想。我是写文件的应用程序,问题是??你每秒都在读你自己的文件?这是某种硬盘耐久性测试吗?显示您正在正确处理编写器的Post代码。如果您这样做是为了在两个应用程序之间通信,那么这是错误的。有许多更好的方法可以将信息从一个应用程序发送到另一个应用程序:WPF或旧.NET版本中的远程处理,普通套接字,等等。使用文件进行通信是一个错误的想法。我正在考虑将其转换为使用套接字。。但不幸的是,源代码一定会使用该方法..如果我在生成XML文件fo=\u fsopenfilename,openStr,\u SH_DENYNO;,的应用程序上使用该方法会怎么样;,这会对试图实现文件的应用程序产生任何影响吗?我没有太多使用fsopen,但这让我相信它会起作用。如果你走这条路,我觉得在读取XML文件的程序中使用Shu DENYRW标志调用fsopen,在编写XML文件的程序中使用Shu DENYNO标志应该可以工作。如果我在生成XML文件fo=fsopenfilename,openStr,Shu DENYNO;,的应用程序中使用它会怎么样;,这会对试图实现文件的应用程序产生任何影响吗?我没有太多使用fsopen,但这让我相信它会起作用。如果你走这条路,我觉得在读取XML文件的程序中使用_SH_DENYRW标志调用_fsopen,在写入XML文件的程序中使用_SH_DENYNO标志调用.@Fahad.ag请尝试使用FileShare打开.XML文件进行写入。使用FileShare读取和写入。ReadWrite-如更新后的答案所示。@Fahad.ag请尝试打开.XML文件进行写入。读取和写入用于使用FileShare.ReadWrite写入-如更新的答案中所示。