zoukankan      html  css  js  c++  java
  • FileSystemWatcher 读取文件时出现被占用的解决方法

    今天做一个小程序监控目录并序列化XML时遇到第一次正常,第二个新文件加入时出现文件被占用的错误,记录下解决方法。

     1 FileSystemWatcher watcher = new FileSystemWatcher{
     2                 Path = path,
     3                 Filter = filter,
     4                 EnableRaisingEvents = true,
     5                 IncludeSubdirectories = true,
     6                 NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName |
     7                     NotifyFilters.FileName | NotifyFilters.LastAccess
     8                     | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size
     9             };
    10             watcher.Created += OnCreated;
    11 
    12 private static void OnCreated(object source, FileSystemEventArgs e)
    13         {
    14             Console.WriteLine("Got a new file " + e.Name);
    15 
    16                 #region === 读取文件内容 ===
    17                 string xmlStr = string.Empty;
    18                 while (true)
    19                 {
    20                     try
    21                     {
    22                         using (Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
    23                         {
    24                             if (stream != null)
    25                                 break;
    26                         }
    27                         System.Threading.Thread.Sleep(500);
    28                     }
    29                     catch (Exception ex)
    30                     {
    31                         Console.WriteLine(string.Format("Output file {0} not yet ready ({1})", e.Name, ex.Message));
    32                     }
    33                 }
    34 
    35                 using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    36                 {
    37                     using (StreamReader sr = new StreamReader(fs, Encoding.Default))
    38                     {
    39                         xmlStr = sr.ReadToEnd();
    40                     }
    41                 }
    42                 #endregion
    43         }

    主要原因是文件还在写入过程中,还被占用,所以不能读取,以下代码为核心解决方法:

    while (true)
                     {
                         try
                         {
                             using (Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                             {
                                 if (stream != null)
                                     break;
                             }
                             System.Threading.Thread.Sleep(500);
                         }
                         catch (Exception ex)
                         {
                             Console.WriteLine(string.Format("Output file {0} not yet ready ({1})", e.Name, ex.Message));
                         }
                     }

     提示:如果是以windows 服务的形式访问网络文件时,不能通知映射盘符的方式,必须是以IP或者hostname方式,比如不能是Z:\abc\,必须为\192.168.1.2abc

  • 相关阅读:
    MySQL——索引
    MySQL——逻辑分层与存储引擎
    APP测试总结
    如何提高测试的质量
    测试用例的基础
    opencv图像处理常用操作一
    【bug】【Cannot find reference 'imread' in '__init__.py | __init__.py'】
    Numpy学习笔记
    工业互联网
    Python基本的数据清洗
  • 原文地址:https://www.cnblogs.com/TandyChan/p/4819672.html
Copyright © 2011-2022 走看看