Przejdź do treści stopki
POMOC .NET

FileStream C# (Jak to dziala dla programistow)

W tym artykule skupimy się na klasie FileStream w języku C# oraz na tym, jak pomaga ona w wykonywaniu operacji odczytu i zapisu plików. Przeanalizujemy praktyczne przykłady, zrozumiemy, jak działa FileStream w swej istocie, i nauczymy się, jak efektywnie zarządzać danymi plików. Niniejszy przewodnik jest skierowany do osób, które dopiero zaczynają przygodę z obsługą plików w języku C#, dlatego język pozostanie przyjazny dla początkujących, a jednocześnie zawiera szczegółowe instrukcje dotyczące pracy z plikami w języku C# oraz wprowadzenie do biblioteki IronPDF.

Czym jest FileStream?

Klasa FileStream w języku C# umożliwia obsługę plików przy użyciu bajtów. Obsługuje operacje odczytu i zapisu plików, umożliwiając bezpośrednią interakcję z zawartością plików. Jest to szczególnie przydatne podczas pracy z plikami w zadaniach związanych z wejściem/wyjściem, zwłaszcza podczas operowania na tablicach bajtów.

Przykłady zastosowań FileStream

FileStream idealnie nadaje się do:

  • Odczytywanie i zapisywanie danych binarnych bezpośrednio z plików lub do plików.
  • Efektywna obsługa dużych plików.
  • Wykonywanie asynchronicznych operacji na plikach.
  • Zarządzanie zasobami systemowymi poprzez efektywne wykorzystanie pamięci.

Podstawowy przykład

Oto prosty przykład otwierania pliku, zapisywania danych, a następnie odczytywania ich za pomocą FileStream:

using System;
using System.IO;

public class Example
{
    public static void Main()
    {
        string path = "example.txt";

        // Creating a FileStream object to handle the file. The file handle is acquired here.
        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
        {
            byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");
            // Write data to file
            fileStream.Write(data, 0, data.Length);
        }

        // Read from the file
        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
            string text = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine(text);
        }
    }
}
using System;
using System.IO;

public class Example
{
    public static void Main()
    {
        string path = "example.txt";

        // Creating a FileStream object to handle the file. The file handle is acquired here.
        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
        {
            byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");
            // Write data to file
            fileStream.Write(data, 0, data.Length);
        }

        // Read from the file
        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
            string text = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine(text);
        }
    }
}
Imports System
Imports System.IO

Public Class Example
	Public Shared Sub Main()
		Dim path As String = "example.txt"

		' Creating a FileStream object to handle the file. The file handle is acquired here.
		Using fileStream As New FileStream(path, FileMode.Create, FileAccess.Write)
			Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!")
			' Write data to file
			fileStream.Write(data, 0, data.Length)
		End Using

		' Read from the file
		Using fileStream As New FileStream(path, FileMode.Open, FileAccess.Read)
			Dim buffer(1023) As Byte
			Dim bytesRead As Integer = fileStream.Read(buffer, 0, buffer.Length)
			Dim text As String = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead)
			Console.WriteLine(text)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

Ten przykład pokazuje tworzenie obiektu FileStream do obsługi operacji odczytu i zapisu plików. Klasa FileStream odczytuje i zapisuje bajty bezpośrednio, dzięki czemu nadaje się do obsługi dużych plików lub danych binarnych. Użyliśmy Encoding do konwersji między tekstem a bajtami.

Zapisywanie danych za pomocą FileStream

Aby zapisać dane do pliku, należy użyć metody Write. Oto przykład, który wyjaśnia, jak to działa bardziej szczegółowo:

using System;
using System.IO;

public class FileWriteExample
{
    public static void Main()
    {
        string path = "output.txt";

        // Creating a FileStream object to write data to the file
        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
        {
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Writing data to FileStream.");
            int offset = 0;
            int count = buffer.Length;

            // Writing data to the file
            fileStream.Write(buffer, offset, count);
        }
    }
}
using System;
using System.IO;

public class FileWriteExample
{
    public static void Main()
    {
        string path = "output.txt";

        // Creating a FileStream object to write data to the file
        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
        {
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Writing data to FileStream.");
            int offset = 0;
            int count = buffer.Length;

            // Writing data to the file
            fileStream.Write(buffer, offset, count);
        }
    }
}
Imports System
Imports System.IO

Public Class FileWriteExample
	Public Shared Sub Main()
		Dim path As String = "output.txt"

		' Creating a FileStream object to write data to the file
		Using fileStream As New FileStream(path, FileMode.Create, FileAccess.Write)
			Dim buffer() As Byte = System.Text.Encoding.UTF8.GetBytes("Writing data to FileStream.")
			Dim offset As Integer = 0
			Dim count As Integer = buffer.Length

			' Writing data to the file
			fileStream.Write(buffer, offset, count)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

W tym kodzie konwertujemy ciąg znaków na tablicę bajtów przy użyciu kodowania UTF8. Metoda Write zapisuje tablicę bajtów do pliku, zaczynając od bieżącej pozycji (określonej przez offset) i zapisując określoną liczbę bajtów.

  • FileMode.Create tworzy nowy plik, nadpisując wszelkie istniejące pliki o tej samej nazwie.
  • FileAccess.Write przyznaje uprawnienia do zapisu w FileStream.

Odczytywanie danych za pomocą FileStream

Teraz przyjrzyjmy się, jak odczytywać dane z pliku za pomocą FileStream.

using System;
using System.IO;

public class FileReadExample
{
    public static void Main()
    {
        // File path
        string path = "output.txt";

        // File Stream Object
        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
            // Output Stream
            string output = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine(output);
        }
    }
}
using System;
using System.IO;

public class FileReadExample
{
    public static void Main()
    {
        // File path
        string path = "output.txt";

        // File Stream Object
        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
            // Output Stream
            string output = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine(output);
        }
    }
}
Imports System
Imports System.IO

Public Class FileReadExample
	Public Shared Sub Main()
		' File path
		Dim path As String = "output.txt"

		' File Stream Object
		Using fileStream As New FileStream(path, FileMode.Open, FileAccess.Read)
			Dim buffer(1023) As Byte
			Dim bytesRead As Integer = fileStream.Read(buffer, 0, buffer.Length)
			' Output Stream
			Dim output As String = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead)
			Console.WriteLine(output)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

W tym przykładzie:

  • FileMode.Open otwiera istniejący plik.
  • Metoda Read odczytuje określoną liczbę bajtów (w zależności od rozmiaru bufora) i zapisuje je w buforze tablicy bajtów.
  • Używamy Encoding.UTF8.GetString do konwersji danych bajtowych z powrotem na ciąg znaków.

Zarządzanie dostępem do plików za pomocą FileStream

Klasa FileStream kontroluje dostęp do plików, umożliwiając precyzyjne zarządzanie uchwytami plików i zasobami systemowymi. Podczas korzystania z FileStream ważne jest, aby upewnić się, że strumień zostanie prawidłowo usunięty po użyciu, albo poprzez ręczne wywołanie Close(), albo poprzez użycie instrukcji using, która automatycznie usuwa strumień.

Obsługa pozycji pliku

Za każdym razem, gdy odczytujesz lub zapisujesz plik, obiekt FileStream śledzi bieżącą pozycję w pliku. Dostęp do tej pozycji można uzyskać za pomocą właściwości Position:

fileStream.Position = 0; // Move to the beginning of the file
fileStream.Position = 0; // Move to the beginning of the file
fileStream.Position = 0 ' Move to the beginning of the file
$vbLabelText   $csharpLabel

Wykorzystanie FileStream do operacji asynchronicznych

FileStream może być używany do asynchronicznych operacji odczytu i zapisu, poprawiając wydajność poprzez umożliwienie uruchamiania innych procesów podczas wykonywania operacji na plikach. Oto podstawowy przykład odczytu asynchronicznego:

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

public class AsyncReadExample
{
    public static async Task Main()
    {
        // Specified Path
        string path = "output.txt";

        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, 4096, true))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length);
            string result = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine(result);
        }
    }
}
using System;
using System.IO;
using System.Threading.Tasks;

public class AsyncReadExample
{
    public static async Task Main()
    {
        // Specified Path
        string path = "output.txt";

        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, 4096, true))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length);
            string result = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine(result);
        }
    }
}
Imports System
Imports System.IO
Imports System.Threading.Tasks

Public Class AsyncReadExample
	Public Shared Async Function Main() As Task
		' Specified Path
		Dim path As String = "output.txt"

		Using fileStream As New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, 4096, True)
			Dim buffer(1023) As Byte
			Dim bytesRead As Integer = Await fileStream.ReadAsync(buffer, 0, buffer.Length)
			Dim result As String = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead)
			Console.WriteLine(result)
		End Using
	End Function
End Class
$vbLabelText   $csharpLabel

Metoda ReadAsync odczytuje dane asynchronicznie. Parametry FileAccess.Read i FileMode.Open kontrolują sposób uzyskiwania dostępu do pliku.

Przykład obsługi wyjątków

Podczas pracy z FileStream obsługa wyjątków jest niezbędna, aby uniknąć błędów wykonania i właściwie zarządzać zasobami systemowymi. Oto wzorzec obsługi wyjątków podczas odczytu lub zapisu do plików:

using System;
using System.IO;

public class ExceptionHandlingExample
{
    public static void Main()
    {
        string path = "nonexistentfile.txt";

        try
        {
            using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[1024];
                int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
                Console.WriteLine("Bytes Read: " + bytesRead);
            }
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine($"Exception: {e.Message}");
        }
    }
}
using System;
using System.IO;

public class ExceptionHandlingExample
{
    public static void Main()
    {
        string path = "nonexistentfile.txt";

        try
        {
            using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[1024];
                int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
                Console.WriteLine("Bytes Read: " + bytesRead);
            }
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine($"Exception: {e.Message}");
        }
    }
}
Imports System
Imports System.IO

Public Class ExceptionHandlingExample
	Public Shared Sub Main()
		Dim path As String = "nonexistentfile.txt"

		Try
			Using fileStream As New FileStream(path, FileMode.Open, FileAccess.Read)
				Dim buffer(1023) As Byte
				Dim bytesRead As Integer = fileStream.Read(buffer, 0, buffer.Length)
				Console.WriteLine("Bytes Read: " & bytesRead)
			End Using
		Catch e As FileNotFoundException
			Console.WriteLine($"Exception: {e.Message}")
		End Try
	End Sub
End Class
$vbLabelText   $csharpLabel

Buforowanie i wydajność

Klasa FileStream zawiera mechanizm buforowania, który pozwala na szybsze działanie, zwłaszcza podczas pracy z dużymi plikami. Dzięki buforowi dane są tymczasowo przechowywane w pamięci, co zmniejsza potrzebę ciągłego dostępu do dysku.

using System;
using System.IO;

public class BufferingExample
{
    public static void Main()
    {
        string path = "bufferedfile.txt";
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Buffered FileStream example.");

        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough))
        {
            fileStream.Write(data, 0, data.Length);
        }
    }
}
using System;
using System.IO;

public class BufferingExample
{
    public static void Main()
    {
        string path = "bufferedfile.txt";
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Buffered FileStream example.");

        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough))
        {
            fileStream.Write(data, 0, data.Length);
        }
    }
}
Imports System
Imports System.IO

Public Class BufferingExample
	Public Shared Sub Main()
		Dim path As String = "bufferedfile.txt"
		Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes("Buffered FileStream example.")

		Using fileStream As New FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough)
			fileStream.Write(data, 0, data.Length)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

W tym przypadku FileOptions.WriteThrough zapewnia, że dane są zapisywane bezpośrednio do pliku, omijając dodatkowe buforowanie. Można jednak kontrolować rozmiar bufora w celu optymalizacji wydajności.

Przedstawiamy IronPDF

FileStream C# (Jak to działa dla programistów): Rysunek 1 — IronPDF: biblioteka PDF dla języka C#

IronPDF to solidna biblioteka C# do tworzenia, edycji i manipulowania dokumentami PDF w aplikacjach .NET. Dzięki IronPDF programiści mogą generować pliki PDF z różnych źródeł, takich jak HTML, obrazy, a nawet zwykły tekst. Dzięki funkcjom takim jak znak wodny, scalanie, dzielenie i ochrona hasłem, IronPDF idealnie nadaje się do aplikacji internetowych i desktopowych, zapewniając precyzyjną kontrolę nad wynikami w formacie PDF.

IronPDF z FileStream

Oto przykład generowania pliku PDF przy użyciu IronPDF i zapisywania go w strumieniu FileStream. Pokazuje to, w jaki sposób IronPDF płynnie integruje się z FileStream, umożliwiając programistom programowe sterowanie tworzeniem i zapisywaniem plików PDF.

using System;
using System.IO;
using IronPdf;

public class IronPDFExample
{
    public static void Main()
    {
        // Define the file path
        string path = "output.pdf";

        // Create an HTML string that we want to convert to PDF
        var htmlContent = "<h1>IronPDF Example</h1><p>This PDF was generated using IronPDF and saved with FileStream.</p>";

        // Initialize IronPDF's ChromePdfRenderer to render HTML as PDF
        var renderer = new ChromePdfRenderer();

        // Generate the PDF from the HTML string
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);

        // Use FileStream to save the generated PDF
        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
        {
            pdfDocument.SaveAs(fileStream);
        }

        Console.WriteLine("PDF created and saved successfully.");
    }
}
using System;
using System.IO;
using IronPdf;

public class IronPDFExample
{
    public static void Main()
    {
        // Define the file path
        string path = "output.pdf";

        // Create an HTML string that we want to convert to PDF
        var htmlContent = "<h1>IronPDF Example</h1><p>This PDF was generated using IronPDF and saved with FileStream.</p>";

        // Initialize IronPDF's ChromePdfRenderer to render HTML as PDF
        var renderer = new ChromePdfRenderer();

        // Generate the PDF from the HTML string
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);

        // Use FileStream to save the generated PDF
        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
        {
            pdfDocument.SaveAs(fileStream);
        }

        Console.WriteLine("PDF created and saved successfully.");
    }
}
Imports System
Imports System.IO
Imports IronPdf

Public Class IronPDFExample
	Public Shared Sub Main()
		' Define the file path
		Dim path As String = "output.pdf"

		' Create an HTML string that we want to convert to PDF
		Dim htmlContent = "<h1>IronPDF Example</h1><p>This PDF was generated using IronPDF and saved with FileStream.</p>"

		' Initialize IronPDF's ChromePdfRenderer to render HTML as PDF
		Dim renderer = New ChromePdfRenderer()

		' Generate the PDF from the HTML string
		Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)

		' Use FileStream to save the generated PDF
		Using fileStream As New FileStream(path, FileMode.Create, FileAccess.Write)
			pdfDocument.SaveAs(fileStream)
		End Using

		Console.WriteLine("PDF created and saved successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

Wnioski

FileStream C# (Jak to działa dla programistów): Rysunek 2 – Strona licencyjna IronPDF

Klasa FileStream w języku C# oferuje zaawansowane funkcje do zarządzania wejściem i wyjściem plików. Pozwala to programistom na wydajne odczytywanie i zapisywanie danych, kontrolowanie bieżącej pozycji w pliku oraz pracę asynchroniczną dzięki zrozumieniu, w jaki sposób współpracują ze sobą tablice bajtów, ścieżki plików i obsługa strumieni. Wykorzystanie FileStream w połączeniu z IronPDF zapewnia programistom elastyczność w zakresie efektywnej obsługi plików PDF w aplikacjach .NET. Niezależnie od tego, czy generujesz raporty, zapisujesz pliki, czy obsługujesz treści dynamiczne, ta kombinacja zapewnia precyzyjną kontrolę nad tworzeniem i przechowywaniem dokumentów PDF.

IronPDF oferuje bezpłatną wersję próbną oraz opłatę licencyjną $799, co czyni go konkurencyjnym rozwiązaniem dla profesjonalnych potrzeb związanych z generowaniem plików PDF.

Często Zadawane Pytania

Jak mogę wykonywać operacje odczytu i zapisu na plikach w języku C#?

W języku C# można wykonywać operacje odczytu i zapisu plików za pomocą klasy FileStream. Pozwala ona na otwarcie pliku i użycie metod takich jak Read i Write w celu efektywnego przetwarzania danych pliku.

Jakie są zalety korzystania z FileStream do obsługi plików w języku C#?

FileStream jest przydatny do obsługi danych binarnych, zarządzania dużymi plikami oraz wydajnego wykonywania asynchronicznych operacji na plikach. Optymalizuje wykorzystanie pamięci i pozwala na precyzyjną kontrolę nad przetwarzaniem danych plików.

W jaki sposób FileStream obsługuje duże pliki?

FileStream obsługuje duże pliki za pomocą buforowania, które tymczasowo przechowuje dane w pamięci w celu zminimalizowania dostępu do dysku. Zwiększa to wydajność i sprawia, że FileStream nadaje się do pracy z dużymi plikami.

Czy FileStream może być używany do asynchronicznych operacji na plikach?

Tak, FileStream obsługuje asynchroniczne operacje na plikach. Można używać metod takich jak ReadAsync i WriteAsync, aby poprawić wydajność aplikacji poprzez umożliwienie przetwarzania współbieżnego.

Dłączego właściwe usuwanie obiektów FileStream jest tak ważne?

Prawidłowe usuwanie obiektów FileStream ma kluczowe znaczenie dla zwolnienia zasobów systemówych i zapobiegania blokowaniu plików. Aby zapewnić prawidłowe zwolnienie zasobów, można użyć instrukcji using lub wywołać metodę Dispose.

Jak zintegrować generowanie plików PDF z obsługą plików w języku C#?

Możesz zintegrować generowanie plików PDF z obsługą plików w języku C#, korzystając z IronPDF. IronPDF pozwala tworzyć i modyfikować dokumenty PDF oraz zapisywać je za pomocą FileStream, płynnie łącząc obsługę plików z tworzeniem plików PDF.

Jakie są funkcje IronPDF do edycji plików PDF?

IronPDF oferuje takie funkcje, jak tworzenie, edycja i manipulowanie plikami PDF, dodawanie znaków wodnych, scałanie dokumentów, dzielenie plików oraz stosowanie ochrony hasłem, co czyni go kompleksowym narzędziem do zarządzania plikami PDF w aplikacjach .NET.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie