Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# - Fatal编程技术网

C# 文件正在被另一个进程使用

C# 文件正在被另一个进程使用,c#,C#,我有一个大致做到这一点的程序: 打开一个文件以从中读取 关闭文件 启动filewatcher以监视文件中的更改 一旦检测到更改,filewatcher的EnableRaisingEvents标志将设置为false,并且该过程将从步骤1开始重复 问题是,在从步骤4转到步骤1之后,它无法读取表示另一个进程正在使用的文件 我收到的错误信息: 未处理的异常:System.IO.IOException:进程无法访问文件“c:\test.xml”,因为它正被另一个进程使用 出什么事了?我的程序步骤1中的读取

我有一个大致做到这一点的程序:

  • 打开一个文件以从中读取
  • 关闭文件
  • 启动filewatcher以监视文件中的更改
  • 一旦检测到更改,filewatcher的EnableRaisingEvents标志将设置为false,并且该过程将从步骤1开始重复
  • 问题是,在从步骤4转到步骤1之后,它无法读取表示另一个进程正在使用的文件

    我收到的错误信息:

    未处理的异常:System.IO.IOException:进程无法访问文件“c:\test.xml”,因为它正被另一个进程使用


    出什么事了?我的程序步骤1中的读取器是否仍然打开文件,或者是某个访问文件的完全不同的进程,或者是filewatcher在从4移动到步骤1后仍在监视文件,尽管将标志设置为false?

    您可以使用类似process Explorer from的工具来查看谁拥有该进程的打开句柄


    文件最有可能是由导致更改通知首先触发的任何因素保持打开状态。

    可能会发生很多事情

    首先,通过在实现
    IDisposable
    的所有内容周围使用using子句,确保正确地处理文件编写器(close不够好)

    其次,如果您只是在阅读,请确保在打开文件时设置了正确的标志

    如果你能提供一个代码块来说明你是如何做到这一点的话,那就更进一步了;特别是在读取文件时注意:即使“file.txt”在记事本中打开,此代码仍然有效,因为它正在打开以供读取

    using System;
    using System.IO;
    
    class Program
    {
      static void Main(string[] args)
      {
        ReadFromFile(@"C:\file.txt");
        Console.ReadLine();
      }
    
      static void ReadFromFile(string filename)
      {
        string line;
        using (StreamReader sr = File.OpenText(filename))
        {
          line  = sr.ReadLine();
          while (line != null)
          {
            Console.WriteLine(str);
            line = sr.ReadLine();
          }
          sr.Close();
        }
      }
    }
    

    或者只是:


    string text=System.IO.File.ReadAllText(@“C:\File.txt”)

    如果您的代码与此类似:

    [STAThread]
    static void Main(string[] args)
    {
        string file = "temp.txt";
        ReadFile(file);
        FileSystemWatcher fswatcher = new FileSystemWatcher(".\\");
        fswatcher.Changed += delegate(object sender, FileSystemEventArgs e)
                                 {
                                     ReadFile(e.FullPath);
                                 };
        while (true)
        {
            fswatcher.WaitForChanged(WatcherChangeTypes.Changed);
        }
    }
    private static void ReadFile(string file)
    {
        Stream stream = File.OpenRead(file);
        StreamReader streamReader = new StreamReader(stream);
        string str = streamReader.ReadToEnd();
        MessageBox.Show(str);
        streamReader.Close();
        stream.Close();
    }
    
    如果您正在通过记事本编辑文件,那么,当您单击“保存”按钮时,它会保持文件打开,而当您刚刚关闭程序并单击“保存”时,它不会打开。我不知道这是一个bug还是记事本的一个未记录的特性,但这可能是你的问题。解决此问题的一种方法是执行以下操作:


    在匿名代理中,或在执行调用
    ReadFile()
    调用
    Thread.Sleep(1000)
    的任何位置,让程序在读取文件之前等待,您的代码应该可以正常工作。

    除了其他答案外,当
    FileWatcher
    对文件作出反应时,该应用程序可能尚未关闭该文件。在步骤1中,尽量不要立即失败,但要尝试几次尝试,稍有延迟。

    您可以使用此MS实用程序获取已打开文件的列表,并了解是谁打开了文件

    openfiles /query
    
    它还允许断开网络用户打开的文件

    openfiles /disconnect /id XXXX
    
    如果要将其用于本地PC,应设置“维护对象列表”全局标志:

    openfiles /local on
    

    按照获取更多详细信息。

    问题是文件系统监视程序会在创建文件时立即通知您。它不会等待文件发布。 例如,当您复制一个大文件时,需要3秒钟的时间来复制,因此您必须在复制之后打开该文件


    你能发布你的代码吗。这可能有助于我们回答您的问题。发布一些代码。帮助我们帮助你。代码有点庞大和保密,因为它是为一家金融公司,但我会看看我是否可以使它安全并发布。也许你应该发布一些代码(只是打开和关闭文件的部分)。也许您的程序仍然打开了文件,或者FileWatcher打开了文件。很可能是步骤1中的代码将文件锁定,我会在那里查看first@xbonez:即使没有
    Thread.Sleep()。(我将
    MessageBox.Show
    更改为
    Console.WriteLine
    )但是,我仍然会使用
    using
    语句。在玩了一些之后,我发现如果我有两个程序实例在观看同一个文件,当我在记事本中单击“Save”时,我从其中一个实例(另一个继续运行)中得到了这个错误:
    进程无法访问文件“c:\file.txt”,因为它正被另一个进程使用。
    在进一步混乱之后,我发现
    进程无法访问文件
    错误,有时甚至只有一个运行的watcher程序副本。因此,我将
    Thread.Sleep(500)
    放在
    ReadFile(e.FullPath)
    之前的
    delegate
    中,现在效果很好。我现在有一个健壮的小文件监视程序:+1 Richard:)