【.Net实用方法总结】 整理并总结System.IO中PipeStream类及其方法介绍

本文详细介绍了C#中的System.IO.Pipes命名空间下的PipeStream类,包括其构造函数、属性和常用方法,如读写、复制、异步操作等,并提供了相关示例代码。此外,还提及了System.IO命名空间中的其他关键类,如FileStream、Path、File和Directory,帮助读者更好地理解和应用管道通信及文件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSDN话题挑战赛第2期
参赛话题:学习笔记

🐋作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。
🐬个人主页:会敲键盘的肘子
🐰系列专栏:.Net实用方法总结
🦀专栏简介:博主针对.Net开发和C站问答过程中遇到的问题进行总结,形成本专栏,希望可以帮助到您解决问题。
🐶座右铭:总有一天你所坚持的会反过来拥抱你。


在这里插入图片描述

🌈写在前面:

本文主要介绍System.IO.Pipes命名空间的PipeStream 类,介绍其常用的方法和示例说明。


👉本文关键字:System.IO、PipeStream类、方法示例、C#

文章目录

1️⃣ System.IO命名空间

.NET中的IO操作命名空间,包含允许读写文件数据流的类型以及提供基本文件和目录支持的类型。

我们在.NET中的IO操作,经常需要调用一下几个类。

  • FileStream类

​ 文件流类,负责大文件的拷贝,读写。

  • Path类

​ Path类中方法,基本都是对字符串(文件名)的操作,与实际文件没多大关系。

  • File类

    File类可以进行一些对小文件拷贝、剪切操作,还能读一些文档文件。

  • Dirctory类

    目录操作,创建文件、删除目录,获取目录下文件名等等。

2️⃣ PipeStream类

♈ 定义

公开管道周围的 Stream 对象,该对象同时支持匿名管道和命名管道。

public abstract class PipeStream : System.IO.Stream
♉ 构造函数
PipeStream(PipeDirection, Int32) 使用指定的 PipeDirection 值和缓冲区大小初始化 PipeStream 类的一个新实例
protected PipeStream (System.IO.Pipes.PipeDirection direction, int bufferSize);

参数

direction

PipeDirection

PipeDirection 值之一,指示管道对象的方向。

bufferSize

Int32

一个大于或等于 0 的正 Int32 值,指示缓冲区大小。

PipeDirection 枚举

In1指定管道方向为向内。
InOut3指定管道方向为双向。
Out2指定管道方向为向外。
♊ 属性
CanRead 获取一个值,该值指示当前流是否支持读取
public override bool CanRead { get; }
CanWrite 获取一个值,该值指示当前流是否支持写入
public override bool CanWrite { get; }
InBufferSize 获取管道的入站缓冲区的大小(以字节为单位)
public virtual int InBufferSize { get; }
IsAsync 获取一个值,该值指示 PipeStream 对象是异步打开还是同步打开
public bool IsAsync { get; }
IsConnected 获取或设置一个值,该值指示是否已连接 PipeStream 对象
public bool IsConnected { get; protected set; }
Length 获取流长度(以字节为单位)
public override long Length { get; }
OutBufferSize 获取管道的出站缓冲区的大小(以字节为单位)
public virtual int OutBufferSize { get; }
♌ 常用方法
Close() 关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)
public virtual void Close ();

注意:此方法调用 Dispose ,指定 true 以释放所有资源。 不需要专门调用 Close 方法。 请确保 Stream 已正确释放每个对象。 可以 Stream using Using 在 Visual Basic) 中 (或块中声明对象,以确保释放流及其所有资源,或者可以显式调用 Dispose 方法。

CopyTo(Stream) 从当前流中读取字节并将其写入到另一流中
public void CopyTo (System.IO.Stream destination);

参数

destination

Stream

当前流的内容将复制到的流。

示例

下面的示例将的内容复制 FileStreamMemoryStream 中。

// Create the streams.
MemoryStream destination = new MemoryStream();

using (FileStream source = File.Open(@"c:\temp\data.dat",
    FileMode.Open))
{

    Console.WriteLine("Source length: {0}", source.Length.ToString());

    // Copy source to destination.
    source.CopyTo(destination);
}

Console.WriteLine("Destination length: {0}", destination.Length.ToString());
CopyTo(Stream, Int32) 使用指定的缓冲区大小,从当前流中读取字节并将其写入到另一流中
public virtual void CopyTo (System.IO.Stream destination, int bufferSize);

参数

destination

Stream

当前流的内容将复制到的流。

bufferSize

Int

缓冲区的大小。 此值必须大于零。 默认大小为 81920。

CopyToAsync(Stream) 从当前流中异步读取字节并将其写入到另一个流中
public System.Threading.Tasks.Task CopyToAsync (System.IO.Stream destination);

参数

destination

Stream

当前流的内容将复制到的流。

示例

下面的示例演示如何使用两个 FileStream 对象将文件从一个目录异步复制到另一个目录。 FileStream 类是从 Stream 类派生的。 请注意, Click 控件的事件处理程序 Button 使用修饰符标记, async 因为它调用异步方法

using System;
using System.Threading.Tasks;
using System.Windows;
using System.IO;

namespace WpfApplication
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            string StartDirectory = @"c:\Users\exampleuser\start";
            string EndDirectory = @"c:\Users\exampleuser\end";

            foreach (string filename in Directory.EnumerateFiles(StartDirectory))
            {
                using (FileStream SourceStream = File.Open(filename, FileMode.Open))
                {
                    using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))
                    {
                        await SourceStream.CopyToAsync(DestinationStream);
                    }
                }
            }
        }
    }
}

CopyToAsync方法使你可以在不阻塞主线程的情况下执行占用大量资源的 i/o 操作。

Dispose() 释放由 Stream 使用的所有资源
public void Dispose ();
Read(Byte[], Int32, Int32) 从指定长度的指定位置开始,从流中读取一个字节块,并将数据写入指定的缓冲区
public override int Read (byte[] buffer, int offset, int count);

参数

buffer

Byte[]

当此方法返回时,包含指定的字节数组,此数组中 offset 和 (offset + count - 1) 之间的值被从当前源中读取的字节所替换。

offset

Int32

buffer 数组中的字节偏移量,其中读取的字节将被替换。

count

Int32

最多读取的字节数。

返回

Int32

读取到 buffer 的总字节数。 如果当前可用的字节数没有请求的那么多,则此数小于请求的字节数;或如果已到达流的末尾,则为零。

示例

以下示例创建匿名管道客户端和管道服务器。 管道服务器使用 Read 此方法从管道客户端读取一系列字节作为验证代码。 管道客户端和管道服务器都是同一示例的一部分。 该示例的服务器部分将创建一个客户端进程,并将其作为参数传递给匿名管道句柄。

using System;
using System.IO;
using System.IO.Pipes;
using System.Diagnostics;

class PipeStreamExample
{
    private static byte[] matchSign = {9, 0, 9, 0};

    public static void Main()
    {
        string[] args = Environment.GetCommandLineArgs();
        if (args.Length < 2)
        {
            Process clientProcess = new Process();

            clientProcess.StartInfo.FileName = Environment.CommandLine;

            using (AnonymousPipeServerStream pipeServer =
                new AnonymousPipeServerStream(PipeDirection.In,
                HandleInheritability.Inheritable))
            {
                // Pass the client process a handle to the server.
                clientProcess.StartInfo.Arguments = pipeServer.GetClientHandleAsString();
                clientProcess.StartInfo.UseShellExecute = false;
                Console.WriteLine("[SERVER] Starting client process...");
                clientProcess.Start();

                pipeServer.DisposeLocalCopyOfClientHandle();

                try
                {
                    if (WaitForClientSign(pipeServer))
                    {
                        Console.WriteLine("[SERVER] Valid sign code received!");
                    }
                    else
                    {
                        Console.WriteLine("[SERVER] Invalid sign code received!");
                    }
                }
                catch (IOException e)
                {
                    Console.WriteLine("[SERVER] Error: {0}", e.Message);
                }
            }
            clientProcess.WaitForExit();
            clientProcess.Close();
            Console.WriteLine("[SERVER] Client quit. Server terminating.");
        }
        else
        {
            using (PipeStream pipeClient = new AnonymousPipeClientStream(PipeDirection.Out, args[1]))
            {
                try
                {
                    Console.WriteLine("[CLIENT] Sending sign code...");
                    SendClientSign(pipeClient);
                }
                catch (IOException e)
                {
                     Console.WriteLine("[CLIENT] Error: {0}", e.Message);
                }
            }
            Console.WriteLine("[CLIENT] Terminating.");
        }
    }

    private static bool WaitForClientSign(PipeStream inStream)
    {
        byte[] inSign = new byte[matchSign.Length];
        int len = inStream.Read(inSign, 0, matchSign.Length);
        bool valid = len == matchSign.Length;

        while (valid && len-- > 0)
        {
            valid = valid && (matchSign[len] == inSign[len]);
        }
        return valid;
    }

    private static void SendClientSign(PipeStream outStream)
    {
        outStream.Write(matchSign, 0, matchSign.Length);
    }
}

CanRead使用属性确定当前PipeStream对象是否支持读取操作。

Read调用方法块,直到count读取字节或到达流的末尾。 有关异步读取操作,请参阅 BeginReadEndRead

ReadAsync(Byte[], Int32, Int32) 从当前流异步读取字节序列,并将流中的位置提升读取的字节数
public System.Threading.Tasks.Task<int> ReadAsync (byte[] buffer, int offset, int count);

参数

buffer

Byte[]

要写入数据的缓冲区。

offset

Int32

buffer 中的字节偏移量,从该偏移量开始写入从流中读取的数据。

count

Int32

最多读取的字节数。

返回

Task<Int32>

表示异步读取操作的任务。 TResult 参数的值包含读入缓冲区的总字节数。 如果当前可用字节数少于所请求的字节数,则该结果值可小于所请求的字节数;如果已到达流结尾时,则为 0(零)。

示例

下面的示例演示如何以异步方式从文件读取。 该示例使用 FileStream 类,该类派生自 Stream 类。

using System;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.IO;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            string filename = @"c:\Temp\userinputlog.txt";
            byte[] result;

            using (FileStream SourceStream = File.Open(filename, FileMode.Open))
            {
                result = new byte[SourceStream.Length];
                await SourceStream.ReadAsync(result, 0, (int)SourceStream.Length);
            }

            UserInput.Text = System.Text.Encoding.ASCII.GetString(result);
        }
    }
}
ReadByte() 从管道读取字节
public override int ReadByte ();

返回

Int32

强制转换为 Int32 的字节;或者如果已到达流的末尾,则为 -1。

Write(Byte[], Int32, Int32) 将字节复制到缓冲流,并将缓冲流内的当前位置前进写入的字节数
public override void Write (byte[] buffer, int offset, int count);

参数

buffer

Byte[]

字节数组,从该字节数组将 count 个字节复制到当前缓冲流中。

offset

Int32

缓冲区中的偏移量,从此处开始将字节复制到当前缓冲流中。

count

Int32

要写入当前缓冲流中的字节数。

WriteAsync(Byte[], Int32, Int32) 将字节序列异步写入当前流,并将流的当前位置提升写入的字节数
public System.Threading.Tasks.Task WriteAsync (byte[] buffer, int offset, int count);

参数

buffer

Byte[]

从中写入数据的缓冲区。

offset

Int32

buffer 中的从零开始的字节偏移量,从此处开始将字节复制到该流。

count

Int32

最多写入的字节数。

返回

Task

表示异步写入操作的任务。

示例

下面的示例演示如何异步写入文件。 该示例使用 FileStream 类,该类派生自 Stream 类。

using System;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.IO;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            UnicodeEncoding uniencoding = new UnicodeEncoding();
            string filename = @"c:\Users\exampleuser\Documents\userinputlog.txt";

            byte[] result = uniencoding.GetBytes(UserInput.Text);

            using (FileStream SourceStream = File.Open(filename, FileMode.OpenOrCreate))
            {
                SourceStream.Seek(0, SeekOrigin.End);
                await SourceStream.WriteAsync(result, 0, result.Length);
            }
        }
    }
}
WriteByte(Byte) 将字节写入当前流
public override void WriteByte (byte value);

参数

value

Byte

要写入流的字节。

Flush() 清除此流的缓冲区,使得所有缓冲数据都写入到文件中
public override void Flush ();
FlushAsync() 异步清除此流的所有缓冲区并导致所有缓冲数据都写入基础设备中
public System.Threading.Tasks.Task FlushAsync ();

返回

Task

表示异步刷新操作的任务。

♎ 更多方法

更多方法请查阅官方文档PipeStream类


⭐写在结尾:

文章中出现的任何错误请大家批评指出,一定及时修改。

希望写在这里的小伙伴能给个三连支持

评论 84
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会敲键盘的肘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值