返回顶部
首页 > 资讯 > 精选 >C#中文件操作、读取文件、Debug/Trace类的示例分析
  • 806
分享到

C#中文件操作、读取文件、Debug/Trace类的示例分析

2023-06-29 17:06:29 806人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“C#中文件操作、读取文件、Debug/Trace类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中文件操作、读取文件、Debug/Trace类的示例分析”

这篇文章主要为大家展示了“C#中文件操作、读取文件、Debug/Trace类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中文件操作、读取文件、Debug/Trace类的示例分析”这篇文章吧。

1、文件操作

这段代码在 System.Private.CoreLib 下,对 System.io.File 中的代码进行精简,供 CLR 使用。

当使用文件时,要提前判断文件路径是否存在,日常项目中要使用到文件的地方应该不少,可以统一一个判断文件是否存在的方法:

        public static bool Exists(string? path)        {            try            {                // 可以将 string? 改成 string                if (path == null)                    return false;                if (path.Length == 0)                    return false;                path = Path.GetFullPath(path);                // After nORMalizing, check whether path ends in directory separator.                // Otherwise, FillAttributeInfo removes it and we may return a false positive.                // GetFullPath should never return null                Debug.Assert(path != null, "File.Exists: GetFullPath returned null");                if (path.Length > 0 && PathInternal.IsDirectorySeparator(path[^1]))                {                    return false;                }                return InternalExists(path);            }            catch (ArgumentException) { }            catch (NotSupportedException) { } // Security can throw this on ":"            catch (SecurityException) { }            catch (IOException) { }            catch (UnauthorizedAccessException) { }            return false;        }

建议项目中对路径进行最终处理的时候,都转换为绝对路径:

Path.GetFullPath(path)

当然,相对路径会被 .net 正确识别,但是对于运维排查问题和各方面考虑,绝对路径容易定位具体位置和排错。

在编写代码时,使用相对路径,不要写死,提高灵活性;在运行阶段将其转为绝对路径;

上面的 NotSupportedException 等异常是操作文件中可能出现的各种异常情况,对于跨平台应用来说,这些异常可能都是很常见的,提前将其异常类型识别处理,可以优化文件处理逻辑以及便于筛查处理错误。

2、读取文件

这段代码在 System.Private.CoreLib 中。

有个读取文件转换为 byte[] 的方法如下:

        public static byte[] ReadAllBytes(string path)        {            // bufferSize == 1 used to avoid unnecessary buffer in FileStream            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 1))            {                long fileLength = fs.Length;                if (fileLength > int.MaxValue)                    throw new IOException(SR.IO_FileTooLong2GB);                int index = 0;                int count = (int)fileLength;                byte[] bytes = new byte[count];                while (count > 0)                {                    int n = fs.Read(bytes, index, count);                    if (n == 0)                        throw Error.GetEndOfFile();                    index += n;                    count -= n;                }                return bytes;            }        }

可以看到 FileStream 的使用,如果单纯是读取文件内容,可以参考里面的代码:

        FileStream fs = new FileStream(path,                                        FileMode.Open,                                        FileAccess.Read,                                        FileShare.Read,                                        bufferSize: 1)

上面的代码同样也存在 File.ReadAllBytes 与之对应, File.ReadAllBytes 内部是使用 InternalReadAllBytes 来处理文档读取:

        private static byte[] InternalReadAllBytes(String path, bool checkHost)        {            byte[] bytes;            // 此 FileStream 的构造函数不是 public ,开发者不能使用            using(FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read,                 FileStream.DefaultBufferSize, FileOptions.None, Path.GetFileName(path), false, false, checkHost)) {                // Do a blocking read                int index = 0;                long fileLength = fs.Length;                if (fileLength > Int32.MaxValue)                    throw new IOException(Environment.GetResourceString("IO.IO_FileTooLong2GB"));                int count = (int) fileLength;                bytes = new byte[count];                while(count > 0) {                    int n = fs.Read(bytes, index, count);                    if (n == 0)                        __Error.EndOfFile();                    index += n;                    count -= n;                }            }            return bytes;        }

这段说明我们可以放心使用 File 静态类中的函数,因为里面已经处理好一些逻辑了,并且自动释放文件。

如果我们手动 new FileStream ,则要判断一些情况,以免使用时报错,最好参考一下上面的代码。

.NET 文件流缓存大小默认是 4096 字节:

internal const int DefaultBufferSize = 4096;

这段代码在 File 类中定义,开发者不能设置缓存块的大小,大多数情况下,4k 是最优的块大小。

ReadAllBytes 的文件大小上限是 2 GB。

3、Debug 、Trace类

这两个类的命名空间为 System.Diagnostics,Debug 、Trace 提供一组有助于调试代码的方法和属性。

Debug 中的所有函数都不会在 Release 中有效,并且所有输出流不会在控制台显示,必须注册侦听器才能读取这些流

Debug 可以打印调试信息并使用断言检查逻辑,使代码更可靠,而不会影响发运产品的性能和代码大小

这类输出方法有 Write 、WriteLine 、 WriteIf 和 WriteLineIf 等,这里输出不会直接打印到控制台

如需将调试信息打印到控制台,可以注册侦听器:

ConsoleTraceListener console = new ConsoleTraceListener();Trace.Listeners.Add(console);

注意, .net core 2.x 以上 Debug 没有 Listeners ,因为 Debug 使用的是 Trace 的侦听器。

我们可以给 Trace.Listeners 注册侦听器,这样相对于 Debug 等效设置侦听器。

        Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));        Debug.WriteLine("aa");

.Net Core 中的监听器都继承了 TraceListener,如 TextWriterTraceListener、ConsoleTraceListener、DefaultTraceListener。

如果需要输出到文件中,可以自行继承 TextWriterTraceListener ,编写文件流输出,也可以使用 DelimitedListTraceListener。

示例:

TraceListener listener = new DelimitedListTraceListener(@"C:\debugfile.txt");        // Add listener.        Debug.Listeners.Add(listener);        // Write and flush.        Debug.WriteLine("Welcome");

处理上述方法输出控制台,也可以使用

ConsoleTraceListener console=......Listeners.Add(console);// 等效于var console = new TextWriterTraceListener(Console.Out)

为了格式化输出流,可以使用 一下属性控制排版:

属性说明
AutoFlush获取或设置一个值,通过该值指示每次写入后是否应在 Flush() 上调用 Listeners。
IndentLevel获取或设置缩进级别。
IndentSize获取或设置缩进的空格数。
        // 1.        Debug.WriteLine("One");        // Indent and then unindent after writing.        Debug.Indent();        Debug.WriteLine("Two");        Debug.WriteLine("Three");        Debug.Unindent();        // End.        Debug.WriteLine("Four");        // Sleep.        System.Threading.Thread.Sleep(10000);
One    Two    ThreeFour

.Assert() 方法对我们调试程序很有帮助,Assert 向开发人员发送一个强消息。在 IDE 中,断言会中断程序的正常操作,但不会终止应用程序。

.Assert() 的最直观效果是输出程序的断言位置。

        Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));        int value = -1;        // A.        // If value is ever -1, then a dialog will be shown.        Debug.Assert(value != -1, "Value must never be -1.");        // B.        // If you want to only write a line, use WriteLineIf.        Debug.WriteLineIf(value == -1, "Value is -1.");
---- DEBUG ASSERTION FaiLED -------- Assert Short Message ----Value must never be -1.---- Assert Long Message ----   at Program.Main(String[] args) in ...Program.cs:line 12Value is -1.

Debug.Prinf() 也可以输出信息,它跟 C 语言的 printf 函数行为一致,将后跟行结束符的消息写入,默认行终止符为回车符后跟一个换行符。

在 IDE 中运行程序时,使用 Debug.Assert()Trace.Assert() 等方法 ,条件为 false 时,IDE 会断言,这相当于条件断点。

在非 IDE 环境下,程序会输出一些信息,但不会有中断效果。

        Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));        Trace.Assert(false);
Process terminated. Assertion Failed   at Program.Main(String[] args) in C:\ConsoleApp4\Program.cs:line 44

个人认为,可以将 Debug、Trace 引入项目中,与日志组件配合使用。Debug、Trace 用于记录程序运行的诊断信息,便于日后排查程序问题;日志用于记录业务过程,数据信息等。

.Assert() 的原理, 在 true 时什么都不做;在 false 时调用 Fail 函数;如果你不注册侦听器的话,默认也没事可做。

.Assert() 唯一可做的事情是等条件为 false 时,执行 Fail 方法,当然我们也可以手动直接调用 Fail 方法,Fail 的代码如下:

public static void Fail(string message) {            if (UseGlobalLock) {                lock (critSec) {                    foreach (TraceListener listener in Listeners) {                        listener.Fail(message);                        if (AutoFlush) listener.Flush();                    }                            }            }            else {                foreach (TraceListener listener in Listeners) {                    if (!listener.IsThreadSafe) {                        lock (listener) {                            listener.Fail(message);                            if (AutoFlush) listener.Flush();                        }                    }                    else {                        listener.Fail(message);                        if (AutoFlush) listener.Flush();                    }                }                        }        }

以上是“C#中文件操作、读取文件、Debug/Trace类的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: C#中文件操作、读取文件、Debug/Trace类的示例分析

本文链接: https://lsjlt.com/news/325900.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#中文件操作、读取文件、Debug/Trace类的示例分析
    这篇文章主要为大家展示了“C#中文件操作、读取文件、Debug/Trace类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中文件操作、读取文件、Debug/Trace类的示例分析”...
    99+
    2023-06-29
  • C#文件操作、读取文件、Debug/Trace类用法
    1、文件操作 这段代码在 System.Private.CoreLib 下,对 System.IO.File 中的代码进行精简,供 CLR 使用。 当使用文件时,...
    99+
    2024-04-02
  • PHP中文件读取的示例分析
    这篇文章主要介绍PHP中文件读取的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.两个函数的语法:  fread()fread    ( reso...
    99+
    2023-06-14
  • C#操作文本文件应用的示例分析
    本篇文章给大家分享的是有关C#操作文本文件应用的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#操作文本文件应用实例:using System; ...
    99+
    2023-06-18
  • C++中文件操作实例分析
    这篇文章主要介绍“C++中文件操作实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中文件操作实例分析”文章能帮助大家解决问题。文件操作意义:利用文件操作可以保存我们程序运行的信息,是持久...
    99+
    2023-07-02
  • GO语言ini配置文件的读取操作示例分析
    小编给大家分享一下GO语言ini配置文件的读取操作示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go适合做什么go是golang的简称,而golang可以...
    99+
    2023-06-15
  • Java中文件操作工具类fileUtil的示例分析
    小编给大家分享一下Java中文件操作工具类fileUtil的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:package com.gc...
    99+
    2023-05-30
    java
  • HTML5中FileReader分布读取文件的示例分析
    这篇文章给大家分享的是有关HTML5中FileReader分布读取文件的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先上效果图先介绍一下H5中FileReader的一些...
    99+
    2024-04-02
  • SQL Server文件操作的示例分析
    这篇文章主要为大家展示了“SQL Server文件操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL Server文件操作的示例分析”这篇文章吧...
    99+
    2024-04-02
  • Android编程中File文件常见存储与读取操作的示例分析
    这篇文章给大家分享的是有关Android编程中File文件常见存储与读取操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:MainActivity文件代码如下:package exa...
    99+
    2023-05-30
    android file
  • C语言中的文件操作实例分析
    这篇文章主要介绍了C语言中的文件操作实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中的文件操作实例分析文章都会有所收获,下面我们一起来看看吧。1.为什么使用文件在学习结构体时,写了一个简易的通讯录...
    99+
    2023-07-02
  • pandas文件读取和保存的示例分析
    这篇文章将为大家详细讲解有关pandas文件读取和保存的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Excel 文件的读取(read_excel)pd.read_excel(io, ...
    99+
    2023-06-27
  • BAT批处理中文件与文件夹操作的示例分析
    这篇文章将为大家详细讲解有关BAT批处理中文件与文件夹操作的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。批处理中的文件、文件夹操作,xcopy命令的用法。一,建bat文件自动执行复制,删除命令。...
    99+
    2023-06-08
  • node.js中fs核心模块读写文件操作的示例分析
    这篇文章将为大家详细讲解有关node.js中fs核心模块读写文件操作的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。node.js 里fs模块常用的功能实现文件的...
    99+
    2024-04-02
  • C语言文件操作实例分析
    这篇文章主要介绍了C语言文件操作实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言文件操作实例分析文章都会有所收获,下面我们一起来看看吧。一、为什么使用文件?当我们在编写一个项目的时候,自然而然想到要...
    99+
    2023-07-02
  • C语言文件的操作实例分析
    这篇文章主要介绍了C语言文件的操作实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言文件的操作实例分析文章都会有所收获,下面我们一起来看看吧。一、为什么使用文件当我们写一些项目的时候,我们应该要把写的...
    99+
    2023-06-30
  • node.js文件操作系统的示例分析
    这篇文章给大家分享的是有关node.js文件操作系统的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:文件读取普通读取同步读取var fs =...
    99+
    2024-04-02
  • Nodejs文件操作和stream的示例分析
    小编给大家分享一下Nodejs文件操作和stream的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!NodeJS文件操作...
    99+
    2024-04-02
  • node.js中fs文件系统目录操作与文件信息操作的示例分析
    这篇文章主要介绍node.js中fs文件系统目录操作与文件信息操作的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!目录操作如果存在该目录,就创建失败同步创建目录fs.mkdi...
    99+
    2024-04-02
  • jQuery ajax读取本地json文件的示例分析
    这篇文章主要介绍了jQuery ajax读取本地json文件的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。json文件{ &nbs...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作