FileStream“无法访问关闭的文件”

2023-12-26

为什么我在使用时会收到上述错误消息using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write))但是当我将其替换为时,程序可以完美执行fileStream = File.Create(path); ?

我想将控制台输出附加到外部文件。这是我的代码:

 //copy console output to file in bin\Debug folder
    class ConsoleCopy : IDisposable
    {
        FileStream fileStream;
        StreamWriter fileWriter;
        TextWriter doubleWriter;
        TextWriter oldOut;
        class DoubleWriter : TextWriter
        {
            TextWriter one;
            TextWriter two;
            public DoubleWriter(TextWriter one, TextWriter two)
            {
                this.one = one;
                this.two = two;
            }
            public override Encoding Encoding
            {
                get { return one.Encoding; }
            }
            //Clears all buffers for the current writer
            public override void Flush()
            {
                one.Flush();

                two.Flush();
            }
            public override void Write(char value)
            {
                **one.Write(value);**//error thrown here
                two.Write(value);
            }
        }
        public ConsoleCopy(string path)
        {
            oldOut = Console.Out;
            try
            {
                **//fileStream = File.Create(path);** //runs alright with this line
                fileWriter = new StreamWriter(fileStream);
                fileWriter.AutoFlush = true;
                doubleWriter = new DoubleWriter(fileWriter, oldOut);
            }
            catch (Exception e)
            {
                Console.WriteLine("Cannot open file for writing");
                Console.WriteLine(e.Message);
                return;
            }
            Console.SetOut(doubleWriter);
        }
        public void Dispose()
        {
            Console.SetOut(oldOut);
            if (fileWriter != null)
            {
                fileWriter.Flush();
                fileWriter.Close();
                fileWriter = null;
            }
            if (fileStream != null)
            {
                fileStream.Close();
                fileStream = null;
            }
        }
    }//end of consoleCopy

我在我的 main 方法中这样调用这个方法:

 //pass output to ConsoleCopy method for copying to .txt file
        using (var cc = new ConsoleCopy("mylogfile.txt"))
        {
           DateTime theDate = DateTime.UtcNow;

            string custom = theDate.ToString("d");

            Console.WriteLine("User has logged in on " + custom);
        }

UPDATE:

该错误之前显示在one.Write(value)。感谢彼得,我已经设法解决了这个问题。感谢大家的贡献和帮助:)


编辑:如果您在编写之前得到它,那么这是因为我误读了问题并将 using 语句放在 ConsoleCopy 构造函数中意味着当 ConsoleCopy 创建完成时,FileStream 将关闭。当您尝试写入它时,因为它已经关闭,您会得到该异常。同样的解决方案也适用 - 让 FileStream 打开并在 Dispose() 中关闭它,它应该与 main 方法中的 using 语句一起使用。

如果我理解正确的话,你会在处理时得到这个异常,对吧?如果是这样,那是因为发生的情况本质上是您关闭该流两次。

using (var cc = new ConsoleCopy("mylogfile.txt"))
{
    // At this time, your filestream is created with the using statement.
    // Writing happens here.
    // Your filestream is closed at the end of the using statement inside of the ConsoleCopy constructor.
} 
// At this point, ConsoleCopy tries to call Dispose(), which flushes and closes everything again. However, this throws an exception because the using statement already closed the FileStream.

如果您的目标是附加到文件末尾并且您的 Dispose() 方法在内部关闭所有内容,为什么不直接替换

**//fileStream = File.Create(path);** //runs alright with this line

with

fileStream = File.Open(path, System.IO.FileMode.Append, System.IO.FileAccess.Write);

并让 main 中的 using 语句为您在内部关闭流?

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

FileStream“无法访问关闭的文件” 的相关文章

  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C 编程:带有数组的函数

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

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 如何在代码编辑器中删除不必要的行间距?

    如何消除 Java 代码编辑器中不必要的换行符 参见屏幕截图 这种格式似乎只适用于一个项目 当我创建新项目时 没有额外的行间距 Thanks 我相信这与镶嵌提示有关 我遇到了同样的问题 这让我抓狂 然后重新启动后出现了一堆代码提示 虽然在适
  • Pixi.js 中的自定义字体

    我尝试将自定义字体加载到 Pixi js 2D WebGL 框架 中 他们有一个使用 woff 谷歌字体的示例 https github com GoodBoyDigital pixi js tree master examples exa
  • 实体框架 Savechanges() 生成的订单 sql

    我正在查看在上下文中调用 SaveChanges 时执行的 sql 它确实按顺序更新 删除和插入 sql 语句 有没有办法将其更改为删除 更新 插入 我能想到的唯一方法就是打电话给你Delete 首先然后SaveChanges 然后做剩下的
  • 带 id 的 div 内多个标签的选择器

    在 jQuery 中 如何为 con 内的标签 h1 h2 h3 和 p 构建选择器 Like con h1 con h2 con h3 con p 但不重复 con 您可以执行以下任一操作 con h1 con h2 con h3 con
  • 如何为cmake中ExternalProject_Add的配置步骤添加对文件的依赖关系

    我正在尝试将一个不使用 cmake 的外部项目添加到我的项目中does使用cmake include ExternalProject ExternalProject Add MatrixSSL SOURCE DIR CMAKE CURREN
  • Prolog运算符在练习中的解释

    我在 Prolog 中有以下关于自然语言的练习 实现以下两个运算符has and of以这样的方式使用这样的短语 彼得有约翰的车回答以下问题 谁有 X 的什么 现在 我知道在英语中这听起来很糟糕 因为在英语中我们通常说 彼得有约翰的车 但我
  • IntPtr 算术

    我尝试以这种方式分配结构数组 struct T int a int b data Marshal AllocHGlobal count Marshal SizeOf typeof T 我想访问分配的数据 将结构 绑定 到分配的数组中的每个元
  • 如何为“Auth-Token”的Web服务添加令牌身份验证?

    我对 Web 服务比较陌生 但我有一个在 Visual Studio C 中使用 包装的 Web 服务 其结尾为Service asmx我在哪里做的Add Service Reference它吸收了所有显示的元素Service asmx w
  • C# 无法使用 TLS1.2 在 Windows 7/Windows Server 上创建 ssl/tls 安全通道

    我知道有很多人问这个问题 但我想我已经阅读了答案和问题很长时间了 但没有任何结果 我有一个调用 Web 服务的 C 应用程序 在 Windows 10 上一切正常 但当我在 Windows 7 或 Windows Server 2008 R
  • 未知的 GCC 链接器错误,但构建成功

    我正在尝试编译一个链接到 Eclipse C C IDE 中的 FMOD 库的程序 我什至没有包含任何库的标头 我只将共享库添加到项目依赖项中 并且出现以下链接错误 Building target Adventum Invoking GCC
  • 如何在单元测试期间捕获 Celery 任务?

    如何在不运行单元测试期间创建的 Celery 任务的情况下进行捕获 例如 我想编写一个如下所示的测试 def test add user avatar add user avatar tasks get deferred tasks ass
  • 通用列表上的 Linq OrderBy 返回不完全按字母顺序排列的列表

    我正在尝试使用对象名称属性对对象的通用列表进行排序 我正在使用 LINQ 但以下表达式不太有效 var query possibleWords OrderBy x gt x Name ToLower ToList foreach Word
  • 使用 PerformSelectorOnMainThread 调用非 void 函数

    正如我的问题的标题所说 我尝试使用以下命令调用非空函数performSelectorOnMainThread 我的函数返回UIImage 当我这样称呼它时 UImage img self performSelectorOnMainThrea
  • .net MemoryCache - 通知项目已删除

    我正在使用带有 NET 4 0 和 c 的 net 内存缓存 我希望在删除某个项目时通知我的应用程序 这样我可以将其已删除到日志文件中或通知 UI 该项目已移除 有没有办法做到这一点 我正在使用 System Runtime Caching
  • 使用 Spring Security 的 SpEL 格式查询 Spring Data JPA

    我有一个 Spring Data JPA 实体 Entity public class User private static final long serialVersionUID 1L Id private Long id 我想包括一个
  • 使用类似 Watin 的工具创建页面屏幕截图

    我需要通过向命令行工具提供页面 URL 来创建页面的屏幕截图 我发现了以下应用程序 将 HTML 转换为图像 http www converthtmltoimage com 这个工具还可以 但需要更灵活的应用 我需要有能力执行以下操作 转到
  • 更新应用程序或数据库中的时间戳列?

    我在数据库中的每个表上都有 date created 和 date modified 列 使用 MySQL 触发器在数据库中设置时间戳列与使用 PHP 在应用程序层设置时间戳列相比有何优点 缺点 当部署在许多服务器上时 哪个更容易维护并且具
  • 如何在Delphi中正确使用IFileOperation删除文件夹中的文件

    我正在尝试创建一个使用 IFileOperation 删除文件中的简单示例 给定目录 包含在另一个 q 的答案中 以便与其他方法进行比较 下面是我的代码MRE https stackoverflow com help minimal rep
  • Lua 从值中找到键

    我正在处理这个 chars Nigo Astran 1 pantera 2 nchar chars name 1 变量 name会给我一个我登录的字符串 在本例中 Nigo Astran and nchar有价值 2 如果我在 Nigo A
  • FileStream“无法访问关闭的文件”

    为什么我在使用时会收到上述错误消息using fileStream new FileStream path FileMode Append FileAccess Write 但是当我将其替换为时 程序可以完美执行fileStream Fil