当我尝试读取正在写入的文件时,为什么会收到未处理的异常:System.IO.IOException?

2023-12-26

我有两个 C# 应用程序,一个是逐行读取文件(文件 A)并将其内容写入另一个文件(文件 B)。

第二个应用程序使用 FileSystemWatcher 来查看文件 B 的更新时间,并报告程序启动时和文件更改时之间的行号差异。

这就是我现在想做的所有事情,最终我想读取文件上次读取时间和当前读取时间之间的行,但直到我可以获得暂停的行差异。

我的应用程序 1 的代码是:

        static void Main(string[] args)
    {
        String line;

        StreamReader sr = new StreamReader("f:\\watch\\input.txt");

        FileStream fs = new FileStream("f:\\watch\\Chat.log", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
        StreamWriter sw = new StreamWriter(fs);

        while ((line = sr.ReadLine()) != null)
        {
            sw.WriteLine(line);
            Thread.Sleep(200);
            Console.WriteLine(line);
            sw.Flush();

        }

        sw.Close();
        sr.Close();

    }

我的应用程序 2 的代码是:

        public static int lines = 0;

    public static void Main()
    {
        Run();
    }

    public static void Run()
    {
        string[] args = System.Environment.GetCommandLineArgs();

        if (args.Length != 2)
        {
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];

watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
   | NotifyFilters.FileName | NotifyFilters.DirectoryName;

watcher.Filter = "Chat.log";

watcher.Changed += new FileSystemEventHandler(OnChanged);

watcher.EnableRaisingEvents = true;

lines = File.ReadAllLines(args[1] + "\\Chat.log").Length;

Console.WriteLine("File lines: " + lines);

while(Console.Read()!='q');
}

private static void OnChanged(object source, FileSystemEventArgs e)
{
    Linework(e.FullPath);
    Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
}

public static string Linework(string path)

{



   string newstring = " ";

using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    int newlines = File.ReadAllLines(path).Length;
    Console.WriteLine("Lines now: " + newlines);
}

return newstring;

}

现在,当我尝试一起运行这两个应用程序时,我收到一个异常,提示“未处理的异常:System.IO.IOException:该进程无法访问该文件,因为它正在被另一个进程使用”。

我有两个文件流设置用于 ReadWrite 访问,其中一个文件流设置用于 FileAccess.Write,另一个文件流设置用于 FileAccess.Read。

关于为什么我会收到此异常的任何线索?

谢谢 槎。


lines = File.ReadAllLines(args[1] + "\Chat.log").Length;

这就是你的问题。该方法打开文件,读取所有行并再次关闭它。打开文件 FileShare.Read 时,它使用“正常”文件共享设置。那denies对也打开该文件的任何其他进程的写访问权限。

这在这里不起作用,您已经使用写访问权限打开了文件。第二个过程不能否认这一点。 IOException 就是结果。

您不能按原样使用 File.ReadAllLines() ,您需要使用 FileShare.ReadWrite 打开 FileStream,将其传递给 StreamReader 并读取所有行。

当心你在这里遇到的非常麻烦的比赛潜力,不能保证你读到的最后一行是完整的一行。在行尾仅获取 \r 而不是 \n 是一个特别棘手的问题。这将是随机且不频繁发生的,是最难解决的错误。也许你的 Flush() 调用可以修复它,我从来没有足够的勇气去测试它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我尝试读取正在写入的文件时,为什么会收到未处理的异常:System.IO.IOException? 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 从图像中裁剪椭圆

    我想从图像中提取椭圆区域 图像中面部部分的一部分 最好在 MATLAB 中 例如 在此图像中 我想提取红色边界内的区域 谁能帮我这个 裁剪很容易 您所要做的就是应用适当的蒙版 诀窍是创建这样一个蒙版 假设A是你的图像 试试这个 Create
  • 为什么将整数与长度为 1 的数组进行比较会返回 true,而与长度为 2 或更大的数组进行比较会返回 false?

    为什么将 0 与长度为 1 的数组进行比较会返回 true 而对于长度为 2 或更大的数组则返回 false 例如 var a undefined 0 a a returns false a push 1 1 0 a a returns t
  • 将图外的点设置为上限

    也许这个问题已经存在 但我找不到它 我正在用 Python 绘制散点图 出于说明目的 我不想设置我的轴 范围以包含所有点 可能有一些非常高或非常低的值 而我在这些点中关心的是它们存在 也就是说 它们需要位于情节中 但不是其实际价值 相反 位
  • 实体框架 4 - 从模型更新数据库架构。不擦除表数据

    我正在开发一个新项目 在该项目中我可以使用 Entity Framework 4 从模型到数据库方法进行工作 我正在从事的项目采用敏捷方法 随着时间的推移将推出不同的阶段 模型优先方法适合我的情况吗 我注意到 当您 从模型生成数据库 时 它
  • 核心数据:在一对多关系中按计数排序

    我目前正在尝试设置一个 NSFetchedResultsController 它将根据一对多关系中的实体数量对表视图进行排序 我不确定这在计数时是否会产生影响 但这也是一种反比关系 我认为这样的事情会很好地工作 NSEntityDescri
  • 如何在Oracle Merge语句中使用useparallel(10)提示

    我们如何在oracle merge语句中使用并行 10 提示 我对提示有点陌生 想知道这是否可以用于合并语句 简而言之 首先 必须在服务器上启用并行执行 您需要检查以下3个参数 select name value from v parame
  • 向 macOS Mojave LaunchDaemon 授予相机权限

    我编写了一个 macOS Mojave LaunchDaemon 它会触发 shell 脚本来运行图像快照 https github com rharder imagesnap程序 目的是每秒从相机捕获一张静态图像 问题 守护进程失败并出现
  • Javascript存储在会话中,从python/flask中的会话中获取

    我正在使用 Flask 应用程序 并尝试使用 javascript 存储 Json 对象 并在 python 中检索它 因为我想将用户生成的一种 购物清单 信息存储到我的数据库中 该对象出现在我的浏览器会话存储中 但似乎我的语法已关闭 因为
  • POSIX 取消点应该如何表现?

    我一直在研究 glibc nptl 取消点的实现 并将其与 POSIX 进行比较 除非我弄错了 否则它是完全错误的 使用的基本模型是 int oldtype LIBC ASYNC CANCEL switch to asynchronous
  • SQL Server CPU 利用率恒定为 80%

    我们在专用 VPS 上有一个小型 目前 Asp Net MVC 5 网站 当我转到服务器并启动任务管理器时 我看到 SQL Server Windows NT 64 位 正在使用大约 80 的 CPU 和 170MB RAM 而 IIS 使
  • 为什么我的备用图标可以在 iPhone 上使用,但不能在 iPad 上使用?

    当我构建并部署到 iPhone 时 我可以调用UIApplication shared setAlternateIconName正好 当我在 iPad Pro 上运行时 出现以下错误 错误域 NSCocoaErrorDomain代码 4 该
  • 在finally 块中抛出异常是否是一种好的做法?

    有一个好问题当从finally中抛出异常时 Catch块不会被评估 https stackoverflow com questions 12150994 catch block is not being evaluated when exc
  • 何时导入 uno

    使用 Ubuntu 12 04 和 LibreOffice 3 5 7 2 我正在尝试了解 Libre Office 中的 Python 脚本 我在网上阅读了很多内容并查看并运行了一些示例 我注意到有些示例导入 uno 有些则不导入 它们都
  • asp.net requiredfieldvalidator 在visible=false 时不起作用

    我的 asp net 站点中有一些必需的字段验证器 我想将其设置为不可见 直到需要为止 但是当我将它们设置为visible false时它们不会触发 如果将它们设置为visible true 它们就会起作用 这是该控件的正确行为还是错误的行
  • MonoTouch 绑定到 ObjectiveC 库不起作用

    the h import
  • vscode 更漂亮的设置

    我最近换了一台新电脑 但很难找到更漂亮的设置 我认为它更漂亮 可能是 eslint 这张 gif 说明了正在发生的事情 http g recordit co H871hfT9Sv gif http g recordit co H871hfT
  • 如何将文件设置为“适合一页上的所有列”设置

    我有一个要求 由 Apache POI 生成的文件需要生成一个带有以下内容的文件使所有列适合一页设置 https stackoverflow com questions 25741049 how to set fit all columns
  • 在 hive 中生成星型模式

    我来自 SQL 数据仓库世界 我通过平面提要生成维度和事实表 在一般的数据仓库项目中 我们将数据源分为事实和维度 前任 我对 Hadoop 完全陌生 我开始知道我可以在 hive 中构建数据仓库 现在 我熟悉了使用 guid 我认为它可以用
  • 在 Eclipse 中,如何添加工具栏按钮来运行批处理文件?

    假设我有一个批处理文件C myscript bat 如何向 eclipse 添加一个工具栏按钮 按下该按钮时运行批处理文件 Under 运行 gt 外部工具 gt 外部工具配置 您可以定义任何外部程序 包括Windows批处理文件 定义后
  • 当我尝试读取正在写入的文件时,为什么会收到未处理的异常:System.IO.IOException?

    我有两个 C 应用程序 一个是逐行读取文件 文件 A 并将其内容写入另一个文件 文件 B 第二个应用程序使用 FileSystemWatcher 来查看文件 B 的更新时间 并报告程序启动时和文件更改时之间的行号差异 这就是我现在想做的所有