2012-03-03 62 views
1

这是场景, 我有一个应用程序每隔2秒覆盖一个xml文件。 然后我有这个C#应用程序,每隔1-2secs读取此文件。 这个过程中运行良好,但有些时候,我得到的错误说,c# - 进程无法访问文件,因为它被另一个进程使用

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

我使用XMLDocument.load方法打开和读取xml文件。

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

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

正如我希望程序继续运行,只要用户不停止它。 请帮忙

+0

其他过程是什么?我们无法从这里看到它。睡吧,我想再试一次。 – 2012-03-03 15:17:29

+0

我正在写的文件是应用程序的问题?? – 2012-03-03 15:30:06

+0

你每秒都在读你自己的文件?这是一种硬盘耐久性测试吗?邮政编码,证明您正在妥善处置作者。 – 2012-03-03 15:43:19

回答

1

当另一个应用程序写入同一个文件时,你不能读取文件,如果你开发了这两个应用程序,我会推荐真正的数据库,而不是XML文件。对于excid SQLite

但是如果你不会使用XML文件可以捕获异常XMLDocument.load方法抛出,然后再次尝试读取希望其他过程与书面方式

0

该文件或者仍标记的使用进行操作系统,被另一台计算机使用或有时被您的病毒扫描程序使用,并且没有足够快地释放您的程序。您应该插入一个小的超时/延迟或使用try ... catch捕获异常,然后再次尝试一小段延迟。

0

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

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

为了避免冲突做你改写这样的:

  • 写入新的XML在同一位置的临时文件作为旧XML
  • 新的文件重命名为旧文件

在UNIX文件系统上,这将避免在写入期间读取尝试失败的问题。不确定窗户,但应该工作。

6

请告诉你尝试使用FileStream变量,它是用specialy指定constructor适当FileModeFileAccessFileShare参数实例化阅读XmlDocument内容。您可以使用Load实现的方式将XmlDocument的内容加载到适当打开(用于反向读取访问的共享)文件流作为参数的方法。

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

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; 
} 
+0

不,我所做的只是使用xmldocument.load – 2012-03-03 15:25:52

+0

@ Fahad.ag请尝试打开.xml文件写入与FileShare.Read和用FileShare.ReadWrite写入 - 如更新的答案。 – 2012-03-03 15:58:14

+0

我会尝试.. thnx .. – 2012-03-03 18:46:47

0

要展开什么其他人所说,这里是如何的例子您可以使用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您可以根据需要添加暂停,或者增加重试次数/在达到最大尝试次数时对其进行不同处理。

0

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

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

+0

如果我在生成XML文件fo = _fsopen(filename,openStr,_SH_DENYNO)的应用程序上使用它,这会对尝试实现文件的应用程序有任何影响? – 2012-03-03 15:27:59

+0

我没有多少使用'_fsopen',但[文档](http://msdn.microsoft.com/en-us/library/8f30b0db.aspx)让我相信它会起作用。如果你要走这条路线,我觉得在程序中用'_SH_DENYRW'标志调用'_fsopen'来读程序中的XML文件和'_SH_DENYNO'标志。 – 2012-03-03 15:34:10

+0

我应该试试这个.. – 2012-03-03 15:35:53

相关问题