Skip to main content
.NET Framework Class Library
FileStream Class

Provides a Stream for a file, supporting both synchronous and asynchronous read and write operations.

To browse the .NET Framework source code for this type, see the Reference Source.

Namespace:   System.IO
Assembly:  mscorlib (in mscorlib.dll)
Syntax
<[%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_0_0_0%](True)> _
Public Class FileStream _
	Inherits [%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_0_0_1%]
[[%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_1_0_0%](true)]
public class FileStream : [%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_1_0_1%]
[[%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_2_0_0%](true)]
public ref class FileStream : public [%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_2_0_1%]
[<[%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_3_0_0%](true)>]
type FileStream =  
    class 
        inherit [%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_3_0_1%] 
    end
public class FileStream extends [%$TOPIC/y0bs3w9t_en-us_VS_110_4_0_4_0_0%]

The FileStream type exposes the following members.

Constructors
  NameDescription
Public method FileStream(IntPtr, FileAccess)Obsolete. Initializes a new instance of the FileStream class for the specified file handle, with the specified read/write permission.
Public method FileStream(SafeFileHandle, FileAccess)Initializes a new instance of the FileStream class for the specified file handle, with the specified read/write permission.
Public method Supported by the XNA Framework FileStream(String, FileMode)Initializes a new instance of the FileStream class with the specified path and creation mode.
Public method FileStream(IntPtr, FileAccess, Boolean)Obsolete. Initializes a new instance of the FileStream class for the specified file handle, with the specified read/write permission and FileStream instance ownership.
Public method FileStream(SafeFileHandle, FileAccess, Int32)Initializes a new instance of the FileStream class for the specified file handle, with the specified read/write permission, and buffer size.
Public method Supported by the XNA Framework FileStream(String, FileMode, FileAccess)Initializes a new instance of the FileStream class with the specified path, creation mode, and read/write permission.
Public method FileStream(IntPtr, FileAccess, Boolean, Int32)Obsolete. Initializes a new instance of the FileStream class for the specified file handle, with the specified read/write permission, FileStream instance ownership, and buffer size.
Public method FileStream(SafeFileHandle, FileAccess, Int32, Boolean)Initializes a new instance of the FileStream class for the specified file handle, with the specified read/write permission, buffer size, and synchronous or asynchronous state.
Public method Supported by the XNA Framework FileStream(String, FileMode, FileAccess, FileShare)Initializes a new instance of the FileStream class with the specified path, creation mode, read/write permission, and sharing permission.
Public method FileStream(IntPtr, FileAccess, Boolean, Int32, Boolean)Obsolete. Initializes a new instance of the FileStream class for the specified file handle, with the specified read/write permission, FileStream instance ownership, buffer size, and synchronous or asynchronous state.
Public method Supported by the XNA Framework FileStream(String, FileMode, FileAccess, FileShare, Int32)Initializes a new instance of the FileStream class with the specified path, creation mode, read/write and sharing permission, and buffer size.
Public method Supported by the XNA Framework FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean)Initializes a new instance of the FileStream class with the specified path, creation mode, read/write and sharing permission, buffer size, and synchronous or asynchronous state.
Public method FileStream(String, FileMode, FileAccess, FileShare, Int32, FileOptions)Initializes a new instance of the FileStream class with the specified path, creation mode, read/write and sharing permission, the access other FileStreams can have to the same file, the buffer size, and additional file options.
Public method FileStream(String, FileMode, FileSystemRights, FileShare, Int32, FileOptions)Initializes a new instance of the FileStream class with the specified path, creation mode, access rights and sharing permission, the buffer size, and additional file options.
Public method FileStream(String, FileMode, FileSystemRights, FileShare, Int32, FileOptions, FileSecurity)Initializes a new instance of the FileStream class with the specified path, creation mode, access rights and sharing permission, the buffer size, additional file options, access control and audit security.
Top
Properties
  NameDescription
Public property Supported by the XNA Framework CanReadGets a value indicating whether the current stream supports reading. (Overrides StreamCanRead.)
Public property Supported by the XNA Framework CanSeekGets a value indicating whether the current stream supports seeking. (Overrides StreamCanSeek.)
Public property Supported by the XNA Framework CanTimeoutGets a value that determines whether the current stream can time out. (Inherited from Stream.)
Public property Supported by the XNA Framework CanWriteGets a value indicating whether the current stream supports writing. (Overrides StreamCanWrite.)
Public property HandleObsolete. Gets the operating system file handle for the file that the current FileStream object encapsulates.
Public property Supported by the XNA Framework IsAsyncGets a value indicating whether the FileStream was opened asynchronously or synchronously.
Public property Supported by the XNA Framework LengthGets the length in bytes of the stream. (Overrides StreamLength.)
Public property Supported by the XNA Framework NameGets the name of the FileStream that was passed to the constructor.
Public property Supported by the XNA Framework PositionGets or sets the current position of this stream. (Overrides StreamPosition.)
Public property Supported by the XNA Framework ReadTimeoutGets or sets a value, in miliseconds, that determines how long the stream will attempt to read before timing out. (Inherited from Stream.)
Public property SafeFileHandleGets a SafeFileHandle object that represents the operating system file handle for the file that the current FileStream object encapsulates.
Public property Supported by the XNA Framework WriteTimeoutGets or sets a value, in miliseconds, that determines how long the stream will attempt to write before timing out. (Inherited from Stream.)
Top
Methods
  NameDescription
Public method Supported by the XNA Framework BeginReadBegins an asynchronous read operation. (Consider using ReadAsync instead; see the Remarks section.) (Overrides StreamBeginRead(Byte, Int32, Int32, AsyncCallback, Object).)

In XNA Framework 3.0, this member is inherited from Stream BeginRead(Byte, Int32, Int32, AsyncCallback, Object).
Public method Supported by the XNA Framework BeginWriteBegins an asynchronous write operation. (Consider using WriteAsync instead; see the Remarks section.) (Overrides StreamBeginWrite(Byte, Int32, Int32, AsyncCallback, Object).)

In XNA Framework 3.0, this member is inherited from Stream BeginWrite(Byte, Int32, Int32, AsyncCallback, Object).
Public method Supported by the XNA Framework CloseCloses the current stream and releases any resources (such as sockets and file handles) associated with the current stream. Instead of calling this method, ensure that the stream is properly disposed. (Inherited from Stream.)
Public method CopyTo(Stream)Reads the bytes from the current stream and writes them to another stream. (Inherited from Stream.)
Public method CopyTo(Stream, Int32)Reads the bytes from the current stream and writes them to another stream, using a specified buffer size. (Inherited from Stream.)
Public method CopyToAsync(Stream)Asynchronously reads the bytes from the current stream and writes them to another stream. (Inherited from Stream.)
Public method CopyToAsync(Stream, Int32)Asynchronously reads the bytes from the current stream and writes them to another stream, using a specified buffer size. (Inherited from Stream.)
Public method CopyToAsync(Stream, Int32, CancellationToken)Asynchronously reads the bytes from the current stream and writes them to another stream, using a specified buffer size and cancellation token. (Inherited from Stream.)
Public method CreateObjRefCreates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. (Inherited from MarshalByRefObject.)
Protected method Supported by the XNA Framework CreateWaitHandleObsolete. Allocates a WaitHandle object. (Inherited from Stream.)
Public method Supported by the XNA Framework DisposeReleases all resources used by the Stream. (Inherited from Stream.)
Protected method Supported by the XNA Framework Dispose(Boolean)Releases the unmanaged resources used by the FileStream and optionally releases the managed resources. (Overrides StreamDispose(Boolean).)
Public method Supported by the XNA Framework EndReadWaits for the pending asynchronous read operation to complete. (Consider using ReadAsync instead; see the Remarks section.) (Overrides StreamEndRead(IAsyncResult).)

In XNA Framework 3.0, this member is inherited from Stream EndRead(IAsyncResult).
Public method Supported by the XNA Framework EndWriteEnds an asynchronous write operation and blocks until the I/O operation is complete. (Consider using WriteAsync instead; see the Remarks section.) (Overrides StreamEndWrite(IAsyncResult).)

In XNA Framework 3.0, this member is inherited from Stream EndWrite(IAsyncResult).
Public method Supported by the XNA Framework Equals(Object)Determines whether the specified object is equal to the current object. (Inherited from Object.)
Protected method Supported by the XNA Framework FinalizeEnsures that resources are freed and other cleanup operations are performed when the garbage collector reclaims the FileStream. (Overrides ObjectFinalize.)
Public method Supported by the XNA Framework FlushClears buffers for this stream and causes any buffered data to be written to the file. (Overrides StreamFlush.)
Public method Flush(Boolean)Clears buffers for this stream and causes any buffered data to be written to the file, and also clears all intermediate file buffers.
Public method FlushAsyncAsynchronously clears all buffers for this stream and causes any buffered data to be written to the underlying device. (Inherited from Stream.)
Public method FlushAsync(CancellationToken)Asynchronously clears all buffers for this stream, causes any buffered data to be written to the underlying device, and monitors cancellation requests. (Overrides StreamFlushAsync(CancellationToken).)
Public method GetAccessControlGets a FileSecurity object that encapsulates the access control list (ACL) entries for the file described by the current FileStream object.
Public method Supported by the XNA Framework GetHashCodeServes as the default hash function. (Inherited from Object.)
Public method GetLifetimeServiceRetrieves the current lifetime service object that controls the lifetime policy for this instance. (Inherited from MarshalByRefObject.)
Public method Supported by the XNA Framework GetTypeGets the Type of the current instance. (Inherited from Object.)
Public method InitializeLifetimeServiceObtains a lifetime service object to control the lifetime policy for this instance. (Inherited from MarshalByRefObject.)
Public method LockPrevents other processes from reading from or writing to the FileStream.
Protected method Supported by the XNA Framework MemberwiseCloneCreates a shallow copy of the current Object. (Inherited from Object.)
Protected method MemberwiseClone(Boolean)Creates a shallow copy of the current MarshalByRefObject object. (Inherited from MarshalByRefObject.)
Protected method ObjectInvariantInfrastructure. Obsolete. Provides support for a Contract. (Inherited from Stream.)
Public method Supported by the XNA Framework ReadReads a block of bytes from the stream and writes the data in a given buffer. (Overrides StreamRead(Byte, Int32, Int32).)
Public method ReadAsync(Byte, Int32, Int32)Asynchronously reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. (Inherited from Stream.)
Public method ReadAsync(Byte, Int32, Int32, CancellationToken)Asynchronously reads a sequence of bytes from the current stream, advances the position within the stream by the number of bytes read, and monitors cancellation requests. (Overrides StreamReadAsync(Byte, Int32, Int32, CancellationToken).)
Public method Supported by the XNA Framework ReadByteReads a byte from the file and advances the read position one byte. (Overrides StreamReadByte.)
Public method Supported by the XNA Framework SeekSets the current position of this stream to the given value. (Overrides StreamSeek(Int64, SeekOrigin).)
Public method SetAccessControlApplies access control list (ACL) entries described by a FileSecurity object to the file described by the current FileStream object.
Public method Supported by the XNA Framework SetLengthSets the length of this stream to the given value. (Overrides StreamSetLength(Int64).)
Public method Supported by the XNA Framework ToStringReturns a string that represents the current object. (Inherited from Object.)
Public method UnlockAllows access by other processes to all or part of a file that was previously locked.
Public method Supported by the XNA Framework WriteWrites a block of bytes to the file stream. (Overrides StreamWrite(Byte, Int32, Int32).)
Public method WriteAsync(Byte, Int32, Int32)Asynchronously writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. (Inherited from Stream.)
Public method WriteAsync(Byte, Int32, Int32, CancellationToken)Asynchronously writes a sequence of bytes to the current stream, advances the current position within this stream by the number of bytes written, and monitors cancellation requests. (Overrides StreamWriteAsync(Byte, Int32, Int32, CancellationToken).)
Public method Supported by the XNA Framework WriteByteWrites a byte to the current position in the file stream. (Overrides StreamWriteByte(Byte).)
Top
Extension Methods
  NameDescription
Public Extension Method AsInputStreamConverts a managed stream in the .NET for Windows 8.x Store apps to an input stream in the Windows Runtime. (Defined by WindowsRuntimeStreamExtensions.)
Public Extension Method AsOutputStreamConverts a managed stream in the .NET for Windows 8.x Store apps to an output stream in the Windows Runtime. (Defined by WindowsRuntimeStreamExtensions.)
Public Extension Method AsRandomAccessStreamConverts the specified stream to a random access stream. (Defined by WindowsRuntimeStreamExtensions.)
Top
Remarks
NoteNote

To view the .NET Framework source code for this type, see the Reference Source. You can browse through the source code online, download the reference for offline viewing, and step through the sources (including patches and updates) during debugging; see instructions.

Use the FileStream class to read from, write to, open, and close files on a file system, and to manipulate other file-related operating system handles, including pipes, standard input, and standard output. You can use the Read, Write, CopyTo, and Flush methods to perform synchronous operations, or the ReadAsync, WriteAsync, CopyToAsync, and FlushAsync methods to perform asynchronous operations. Use the asynchronous methods to perform resource-intensive file operations without blocking the main thread. This performance consideration is particularly important in a Windows Store app or desktop app where a time-consuming stream operation can block the UI thread and make your app appear as if it is not working. FileStream buffers input and output for better performance.

Important noteImportant

This type implements the IDisposable interface. When you have finished using the type, you should dispose of it either directly or indirectly. To dispose of the type directly, call its Dispose method in a try/catch block. To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). For more information, see the “Using an Object that Implements IDisposable” section in the IDisposable interface topic.

The IsAsync property detects whether the file handle was opened asynchronously. You specify this value when you create an instance of the FileStream class using a constructor that has an isAsync, useAsync, or options parameter. When the property is true, the stream utilizes overlapped I/O to perform file operations asynchronously. However, the IsAsync property does not have to be true to call the ReadAsync, WriteAsync, or CopyToAsync method. When the IsAsync property is false and you call the asynchronous read and write operations, the UI thread is still not blocked, but the actual I/O operation is performed synchronously.

The Seek method supports random access to files. Seek allows the read/write position to be moved to any position within the file. This is done with byte offset reference point parameters. The byte offset is relative to the seek reference point, which can be the beginning, the current position, or the end of the underlying file, as represented by the three members of the SeekOrigin enumeration.

NoteNote

Disk files always support random access. At the time of construction, the CanSeek property value is set to true or false depending on the underlying file type.If the underlying file type is FILE_TYPE_DISK, as defined in winbase.h, the CanSeek property value is true. Otherwise, the CanSeek property value is false.

If a process terminates with part of a file locked or closes a file that has outstanding locks, the behavior is undefined.

For directory operations and other file operations, see the File, Directory, and Path classes. The File class is a utility class that has static methods primarily for the creation of FileStream objects based on file paths. The MemoryStream class creates a stream from a byte array and is similar to the FileStream class.

For a list of common file and directory operations, see Common I/O Tasks.

Detection of Stream Position Changes

When a FileStream object does not have an exclusive hold on its handle, another thread could access the file handle concurrently and change the position of the operating system's file pointer that is associated with the file handle. In this case, the cached position in the FileStream object and the cached data in the buffer could be compromised. The FileStream object routinely performs checks on methods that access the cached buffer to ensure that the operating system's handle position is the same as the cached position used by the FileStream object.

If an unexpected change in the handle position is detected in a call to the Read method, the .NET Framework discards the contents of the buffer and reads the stream from the file again. This can affect performance, depending on the size of the file and any other processes that could affect the position of the file stream.

If an unexpected change in the handle position is detected in a call to the Write method, the contents of the buffer are discarded and an IOException exception is thrown.

A FileStream object will not have an exclusive hold on its handle when either the SafeFileHandle property is accessed to expose the handle or the FileStream object is given the SafeFileHandle property in its constructor.

Examples

The following example demonstrates some of the FileStream constructors.

Imports System
Imports System.IO
Imports System.Text

Public Class Test

    Public Shared Sub Main()
        Dim path As String = "c:\temp\MyTest.txt" 

        ' Delete the file if it exists. 
        If File.Exists(path) Then
            File.Delete(path)
        End If 

        'Create the file. 
        Dim fs As FileStream = File.Create(path)

        AddText(fs, "This is some text")
        AddText(fs, "This is some more text,")
        AddText(fs, Environment.NewLine & "and this is on a new line")
        AddText(fs, Environment.NewLine & Environment.NewLine)
        AddText(fs, "The following is a subset of characters:" & Environment.NewLine)

        Dim i As Integer 

        For i = 1 To 120
            AddText(fs, Convert.ToChar(i).ToString())

        Next

        fs.Close()

        'Open the stream and read it back.
        fs = File.OpenRead(path)
        Dim b(1024) As Byte 
        Dim temp As UTF8Encoding = New UTF8Encoding(True)

        Do While fs.Read(b, 0, b.Length) > 0
            Console.WriteLine(temp.GetString(b))
        Loop

        fs.Close()
    End Sub 

    Private Shared Sub AddText(ByVal fs As FileStream, ByVal value As String)
        Dim info As Byte() = New UTF8Encoding(True).GetBytes(value)
        fs.Write(info, 0, info.Length)
    End Sub 
End Class
using System;
using System.IO;
using System.Text;

class Test
{

    public static void Main()
    {
        string path = @"c:\temp\MyTest.txt";

        // Delete the file if it exists. 
        if (File.Exists(path))
        {
            File.Delete(path);
        }

        //Create the file. 
        using (FileStream fs = File.Create(path))
        {
            AddText(fs, "This is some text");
            AddText(fs, "This is some more text,");
            AddText(fs, "\r\nand this is on a new line");
            AddText(fs, "\r\n\r\nThe following is a subset of characters:\r\n");

            for (int i=1;i < 120;i++)
            {
                AddText(fs, Convert.ToChar(i).ToString());

            }
        }

        //Open the stream and read it back. 
        using (FileStream fs = File.OpenRead(path))
        {
            byte[] b = new byte[1024];
            UTF8Encoding temp = new UTF8Encoding(true);
            while (fs.Read(b,0,b.Length) > 0)
            {
                Console.WriteLine(temp.GetString(b));
            }
        }
    }

    private static void AddText(FileStream fs, string value)
    {
        byte[] info = new UTF8Encoding(true).GetBytes(value);
        fs.Write(info, 0, info.Length);
    }
}
using namespace System;
using namespace System::IO;
using namespace System::Text;

void AddText( FileStream^ fs, String^ value )
{
   array<Byte>^info = (gcnew UTF8Encoding( true ))->GetBytes( value );
   fs->Write( info, 0, info->Length );
}

int main()
{
   String^ path = "c:\\temp\\MyTest.txt";

   // Delete the file if it exists. 
   if ( File::Exists( path ) )
   {
      File::Delete( path );
   }

   //Create the file.
   {
      FileStream^ fs = File::Create( path );
      try
      {
         AddText( fs, "This is some text" );
         AddText( fs, "This is some more text," );
         AddText( fs, "\r\nand this is on a new line" );
         AddText( fs, "\r\n\r\nThe following is a subset of characters:\r\n" );
         for ( int i = 1; i < 120; i++ )
         {
            AddText( fs, Convert::ToChar( i ).ToString() );

            //Split the output at every 10th character. 
            if ( Math::IEEERemainder( Convert::ToDouble( i ), 10 ) == 0 )
            {
               AddText( fs, "\r\n" );
            }
         }
      }
      finally
      {
         if ( fs )
            delete (IDisposable^)fs;
      }
   }

   //Open the stream and read it back.
   {
      FileStream^ fs = File::OpenRead( path );
      try
      {
         array<Byte>^b = gcnew array<Byte>(1024);
         UTF8Encoding^ temp = gcnew UTF8Encoding( true );
         while ( fs->Read( b, 0, b->Length ) > 0 )
         {
            Console::WriteLine( temp->GetString( b ) );
         }
      }
      finally
      {
         if ( fs )
            delete (IDisposable^)fs;
      }
   }
}

The following example shows how to write to a file asynchronously. This code runs in a WPF app that has a TextBlock named UserInput and a button hooked up to a Click event handler that is named Button_Click. The file path needs to be changed to a file than exits on the computer.

Imports System.IO
Imports System.Text

Class MainWindow
    Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim uniencoding As UnicodeEncoding = New UnicodeEncoding()
        Dim filename As String = "c:\Users\exampleuser\Documents\userinputlog.txt" 

        Dim result As Byte() = uniencoding.GetBytes(UserInput.Text)

        Using SourceStream As FileStream = File.Open(filename, FileMode.OpenOrCreate)
            SourceStream.Seek(0, SeekOrigin.End)
            Await SourceStream.WriteAsync(result, 0, result.Length)
        End Using 
    End Sub 
End Class
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);
            }
        }
    }
}
Version Information

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

XNA Framework

Supported in: 3.0, 2.0, 1.0

.NET for Windows Phone apps

Supported in: Windows Phone 8.1, Windows Phone Silverlight 8.1, Windows Phone Silverlight 8
Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.