使用 FileStream 类控制文件访问

已完成

FileStream 类是 System.IO 命名空间的一部分,用于文件输入和输出作。 与更高级别的抽象(如FileStreamStreamReader)相比,类StreamWriter允许你以更精细的方式处理文件。

若要创建FileStream对象,通常指定文件路径、打开文件(例如FileMode.Open,)FileMode.Create和访问级别(例如,FileAccess.ReadFileAccess.Write)的模式。 该 FileStream 类提供用于读取和写入文件字节的方法,以及用于控制文件访问的属性。

检查 FileStream 属性和方法

FileStream 类提供了多个属性和方法,可用于控制文件访问和执行读/写作。 下面是类的 FileStream 一些关键属性和方法:

FileStream 类包含以下关键属性:

  • Length:获取用字节表示的流长度。
  • 位置:获取或设置流中的当前位置。
  • CanRead:指示流是否支持读取。 如果流可以被读取,则此属性返回 true,否则返回 false
  • CanWrite:指示流是否支持写入。 如果流可写,则此属性返回 true,否则返回 false
  • CanSeek:指示流是否支持搜寻。 如果流支持查找,则此属性返回true;否则返回false

注释

磁盘文件始终支持随机访问。 属性值 CanSeek 设置为 truefalse 取决于基础文件类型。

FileStream 类包括以下关键方法:

  • 读取:从流中读取字节块并将数据写入缓冲区。 例如, fs.Read(buffer, 0, buffer.Length) 将数据读入缓冲区。
  • 写入:使用缓冲区中的数据将字节块写入流。 例如, fs.Write(data, 0, data.Length) 将数据从数据数组写入文件。
  • Seek:设置当前流中的位置。 例如, fs.Seek(0, SeekOrigin.Begin) 将位置移动到文件的开头。
  • 清空:清除当前流的所有缓冲区,并将所有缓冲的数据写入文件。
  • 关闭:关闭当前流并释放与其关联的任何资源。
  • Dispose:释放 FileStream 对象使用的资源。 在直接或间接销毁FileStream对象时,会自动调用此方法。

重要

使用 FileStream 类型后,应直接或间接地处理掉它。 在 try/catch 块或语言构造(如 C# 中的 using)中使用 Dispose 方法。

使用 FileStream 类检查文件读取和写入操作

. FileStream NET 中的类允许从文件系统上读取、写入、打开和关闭文件。 可以使用诸如ReadWriteCopyToFlush等方法执行同步作。 对于资源密集型文件操作,请使用异步方法,例如ReadAsyncWriteAsyncCopyToAsyncFlushAsync,以避免阻塞主线程。

  • 使用同步方法进行简单文件操作。
  • 对性能关键型应用程序使用异步方法。

注释

异步操作在单独的训练模块中介绍。

这里有一个简单的示例,演示如何使用 FileStream 将数据写入文件:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example.txt";
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");

        using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
        {
            fs.Write(data, 0, data.Length);
        }

        Console.WriteLine("Data written to file.");
    }
}

在此示例中,我们将创建一个 FileStream 对象,以将数据写入名为“example.txt”的文件。 如果文件存在,则 FileMode.OpenOrCreate 此选项将打开该文件,或者创建一个新文件(如果该文件不存在)。 该 FileAccess.Write 选项表示我们想要写入文件。 然后,该方法 Write 用于将字节数组写入文件。

以下是如何使用 FileStream 从文件中读取数据:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example.txt";
        byte[] buffer = new byte[1024]; // Adjust buffer size as needed

        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            int bytesRead = fs.Read(buffer, 0, buffer.Length);
            string readData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine("Data read from file: " + readData);
        }
    }
}

在此示例中,我们将创建一个 FileStream 对象,以从文件“example.txt”读取数据。 该 FileMode.Open 选项将打开要读取的文件,该 FileAccess.Read 选项指定要从该文件中读取。 然后,该方法 Read 用于将数据读入缓冲区,该缓冲区随后转换回字符串。

FileStream 类还允许你查找文件中的特定位置。 该方法 Seek 用于设置流中的当前位置。 例如,可用于 fs.Seek(0, SeekOrigin.Begin) 将位置移动到文件的开头。

下面是一个更全面的编码示例,演示如何在文件中读取、写入和查找:


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

class Program
{
    static Task Main()
    {
        string path = "example.txt";
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");

        // Writing to the file
        using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
        {
            fs.Write(data, 0, data.Length);
            fs.Flush();
        }

        // Reading from the file
        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[data.Length];
            fs.Seek(0, SeekOrigin.Begin);
            int bytesRead = fs.Read(buffer, 0, buffer.Length);
            string readData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine("Data read from file: " + readData);
        }
    }
}

在此示例中,我们使用 FileStream 将数据写入文件,然后将数据读回。 我们还演示了如何使用 Seek 该方法移动文件中的位置。 通过了解这些属性和方法,可以在 C# 中使用 FileStream 有效控制文件操作。

使用 FileStream 属性实现文件访问控制

FileStream 类提供用于控制文件访问的其他属性。 这些属性包括:

  • CanRead:指示流是否支持读取。 属性在流可以读取时返回 true,否则返回 false
  • CanWrite:指示流是否支持写入。 此属性在流可以写入时返回true,否则返回false
  • CanSeek:指示流是否支持搜寻。 如果流支持搜寻,则此属性会返回 true;否则返回 false
  • FileAccess:指定文件的访问级别。 它可以设置为 ReadWrite也可以 ReadWrite
  • FileShare:指定其他线程对文件具有的访问级别。 它可以设置为NoneReadWriteReadWrite
  • FileMode:指定作系统应如何打开文件。 它可以设置为Append、、CreateCreateNewOpenOpenOrCreateTruncate
  • FileOptions:指定用于打开文件的选项。 它可以设置为None、、AsynchronousSequentialScan、或RandomAccessWriteThrough

以下是如何使用 FileStream 属性实现访问控制的示例:

using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
    static Task Main()
    {
        string path = "example.txt";
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");

        // Writing to the file
        using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, 4096, false))
        {
            fs.Write(data, 0, data.Length);
            fs.Flush();
        }
        {
            await fs.Write(data, 0, data.Length);
            await fs.Flush();
        }

        // Reading from the file
        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, 4096, false))
        {
            byte[] buffer = new byte[data.Length];
            fs.Seek(0, SeekOrigin.Begin);
            int bytesRead = await fs.Read(buffer, 0, buffer.Length);
            string readData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine("Data read from file: " + readData);
        }
    }
}

此代码演示如何使用 FileStream 属性来控制文件访问。 在写入文件时,将FileAccess属性设置为Write;在从文件读取时,设置为Read。 该 FileShare 属性设置为 None,这意味着在文件被使用时,其他线程无法访问它。

演示文件操作过程中的错误处理

在文件操作期间,错误处理对于管理可能发生的异常至关重要。 该 FileStream 类对访问缓存缓冲区的方法执行检查,以确保作系统的句柄位置与对象使用的 FileStream 缓存位置匹配。

如果检测到句柄位置意外更改:

  • Read 操作期间,将丢弃缓冲区内容,流将再次从文件读取。
  • Write操作期间,将丢弃缓冲区内容,并引发IOException异常。

注释

SafeFileHandle 属性被访问或在其构造函数中给出时,FileStream 对象不会对其句柄具有独占保留。

下面是有关如何在文件作过程中实现错误处理的示例:

using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
    static Task Main()
    {
        string path = "example.txt";
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");

        try
        {
            // Writing to the file
            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
            {
                fs.Write(data, 0, data.Length);
                fs.Flush();
            }

            // Reading from the file
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[data.Length];
                fs.Seek(0, SeekOrigin.Begin);
                int bytesRead = fs.Read(buffer, 0, buffer.Length);
                string readData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
                Console.WriteLine("Data read from file: " + readData);
            }
        }
        catch (IOException ex)
        {
            Console.WriteLine("An error occurred: " + ex.Message);
        }
    }
}

在此示例中,我们使用块 try/catch 来处理文件作期间可能发生的任何 IOException 异常。 如果发生错误,则会将异常消息打印到控制台。 这可确保程序不会崩溃,并提供有关错误的有用信息。 通过实现错误处理,可以正常管理异常,并确保应用程序保持可靠且用户友好。

摘要

在本单元中,你了解了 FileStream .NET 中的类,该类提供对文件输入和输出作的低级别控制。 你浏览了类的属性和方法 FileStream ,包括如何读取和写入文件,以及如何在文件中查找特定位置。 你还了解了如何使用FileStream 属性,例如 FileAccessFileShareFileMode,来实现文件访问控制,以及如何使用 try/catch 块在文件操作过程中处理错误。 通过了解这些概念,可以有效地管理 C# 应用程序中的文件作,并确保它们可靠且用户友好。