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

本文关键字:进程 另一个 因为 访问 文件 | 更新日期: 2023-09-27 18:37:22

我有2个程序,一个是序列化XXXX.xml,另一个是反序列化XXXX.xml.temp文件。这两个程序是独立的,使用每个预定义间隔发生的不同线程。

下面是读取 xml 的代码。在这里,我得到以下异常:

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

    private void StartDiskFlushThread()
    {
        _flushThread = new Thread(ThreadProc);
        _flushThread.IsBackground = true;
        _flushThread.Start();
    }
    private void ThreadProc()
    {
        try
        {
            while (_flushThread.IsAlive)
            {
                FlushStepsToFile();
                Thread.Sleep(_flushInterval);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            Log.Error("ThreadProc failed", ex);
        }
    }
    private void FlushStepsToFile()
    {
        try
        {
            SerializeSteps(1);
        }
        catch (Exception ex)
        {
            Log.Error("Failed to flush steps to disk, retrying", ex);
            Thread.Sleep(1000);
            SerializeSteps(2);
        }
    }
    private void SerializeSteps(int trycount)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(DetailedSteps));
        try
        {
            using (TextWriter textWriter = new StreamWriter(_targetFileLocation))
            {
                serializer.Serialize(textWriter, _detailedSteps);
            }
        }
        catch (Exception ex)
        {
            Log.ErrorFormat("SerializeSteps method failed. try #{0}. Error:{1}", trycount, ex);
        }
    }

至于读取xml的代码。该程序也是一个线程,它将 XXXX.xml 复制到 XXXX.xml.temp 并读取临时文件。

    private void CopyPartialLog()
    {
        try
        {
            File.Copy(ReportFile, DestReportFile, true);
        }
        catch (Exception ex)
        {
            Log.Error("CopyPartialLog failed", ex);
        }
    }

我在那里没有例外,因为我正在阅读不同的文件:XXXX.xml.temp

以下是我从编写 XML 的第一个程序获得的异常:

7077846 [序列化步骤方法 失败。尝试#1。错误:系统.IO.IOException:进程无法访问 文件"xxxx.xml",因为它 正由另一个进程使用。 at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(字符串路径, 文件模式, 文件访问访问, Int32 权限, 布尔使用权限, 文件共享共享, Int32 缓冲区大小、文件选项选项、SECURITY_ATTRIBUTES秒收件人、 字符串 msgPath, Boolean bFromProxy)

我得到的例外是挂起我的作家线程,我不明白为什么。你有什么建议?我该如何解决?

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

当其他进程正在写入时,您无法读取,当其他进程正在读取时,您无法写入(它必须读取文件才能复制它;因此整个复制最终可能毫无意义)。

如何在阅读器上使用一个FileSystemWatcher,一旦文件被写入(和关闭)就会收到通知?编写器可以使用FileSystemWatcher来跟踪何时读取文件或等待完成。

作为替代方案,使用其他形式的进程间通信,例如 TCP/IP、共享内存等。

或者 - 也许更棘手(如果你不小心,你可能会遇到死锁):使用互斥体进行同步。

在多线程应用程序中,我遇到了类似的问题,其中不同的线程试图访问同一对象。尝试对访问该文件的每个对象使用 lock 语句,以防止同时访问同一文件。

我在使用 Xml 时遇到了几乎相同的问题,因为我同时实例化了 XmlReader 和 XmlWiter(您使用的是不同的方法,但有相同的问题)。我所做的是在类中设置读取器/编写器变量,但在它们自己的单独方法之前不要实例化它们。

public class XmlTool
{
    public static string filepath = @"C:''This'That'Folder";
    private static XmlReader reader;
    private static XmlWriter writer;
    public static void Write2Xml(string s)
    {
        writer = XmlWriter.Create(filepath);
        /* Do Stuff */
        writer.Close( );
    }
    public static string ReadFromXml( )
    {
        reader = XmlReader.Create(filepath);
        /* Do Stuff */
        reader.Close( );
    }
}

因此,读取器和编写器仅在其方法运行时实例化,然后在方法完成时关闭。这段代码并不准确,但如果您认为有帮助,我可以向您发送带有注释的原始代码。希望能解释一下!