Export (0) Print
Expand All

FileStream.Lock Method

Prevents other processes from changing the FileStream while permitting read access.

[Visual Basic]
Public Overridable Sub Lock( _
   ByVal position As Long, _
   ByVal length As Long _
)
[C#]
public virtual void Lock(
 long position,
 long length
);
[C++]
public: virtual void Lock(
 __int64 position,
 __int64 length
);
[JScript]
public function Lock(
   position : long,
 length : long
);

Parameters

position
The beginning of the range to lock. The value of this parameter must be equal to or greater than zero (0).
length
The range to be locked.

Exceptions

Exception Type Condition
ArgumentOutOfRangeException position or length is negative.
ObjectDisposedException The file is closed.

Remarks

The following table lists examples of other typical or related I/O tasks.

To do this... See the example in this topic...
Create a text file. Writing Text to a File
Write to a text file. Writing Text to a File
Read from a text file. Reading Text from a File
Append text to a file. Opening and Appending to a Log File

File.AppendText

FileInfo.AppendText

Rename or move a file. File.Move

FileInfo.MoveTo

Copy a file. File.Copy

FileInfo.CopyTo

Get the size of a directory. FileInfo.Length
Get the attributes of a file. File.GetAttributes
Set the attributes of a file. File.SetAttributes
Create a subdirectory. CreateSubdirectory
Read from a binary file. Reading and Writing to a Newly Created Data File
Write to a binary file. Reading and Writing to a Newly Created Data File
See the files in a directory. Name
Sort files in a directory by size. GetFileSystemInfos

Example

[Visual Basic, C#, C++] The following code example demonstrates how to lock part of a file so another process cannot access that part of the file even though it has read/write access to the file. Run the program simultaneously in different command windows and investigate using the different console input options.

[Visual Basic] 
Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Text

Public Class FStreamLock

    Shared Sub Main()
    
        Dim uniEncoding As New UnicodeEncoding()
        Dim lastRecordText As String = _
            "The last processed record number was: "
        Dim textLength As Integer = _
            uniEncoding.GetByteCount(lastRecordText)
        Dim recordNumber As Integer = 13
        Dim byteCount As Integer = _
            uniEncoding.GetByteCount(recordNumber.ToString())
        Dim tempString As String 

        Dim aFileStream As New FileStream( _
            "Test#@@#.dat", FileMode.OpenOrCreate, _
            FileAccess.ReadWrite, FileShare.ReadWrite)
        
        Try
            ' Write the original file data.
            If aFileStream.Length = 0 Then
                tempString = _
                    lastRecordText + recordNumber.ToString()
                aFileStream.Write(uniEncoding.GetBytes(tempString), _
                    0, uniEncoding.GetByteCount(tempString))
            End If

            ' Allow the user to choose the operation.
            Dim consoleInput As Char = "R"C
            Dim readText(CInt(aFileStream.Length)) As Byte
            While consoleInput <> "X"C

                Console.Write(vbcrLf & _
                    "Enter 'R' to read, 'W' to write, 'L' to " & _ 
                    "lock, 'U' to unlock, anything else to exit: ")

                tempString = Console.ReadLine()
                If tempString.Length = 0 Then
                    Exit While
                End If
                consoleInput = Char.ToUpper(tempString.Chars(0))
                Select consoleInput
                
                    ' Read data from the file and 
                    ' write it to the console.
                    Case "R"C
                        Try
                            aFileStream.Seek(0, SeekOrigin.Begin)
                            aFileStream.Read( _
                                readText, 0, CInt(aFileStream.Length))
                            tempString = New String( _
                                uniEncoding.GetChars( _
                                readText, 0, readText.Length))
                            Console.WriteLine(tempString)
                            recordNumber = Integer.Parse( _
                                tempString.Substring( _
                                tempString.IndexOf(":"C) + 2))

                        ' Catch the IOException generated if the 
                        ' specified part of the file is locked.
                        Catch ex As IOException
                            Console.WriteLine("{0}: The read " & _
                                "operation could not be performed " & _
                                "because the specified part of the" & _
                                " file is locked.", _
                                ex.GetType().Name)
                        End Try
                        Exit Select

                    ' Update the file.
                    Case "W"C
                        Try
                            aFileStream.Seek(textLength, _
                                SeekOrigin.Begin)
                            aFileStream.Read( _
                                readText, textLength - 1, byteCount)
                            tempString = New String( _
                                uniEncoding.GetChars( _
                                readText, textLength - 1, byteCount))
                            recordNumber = _
                                Integer.Parse(tempString) + 1
                            aFileStream.Seek( _
                                textLength, SeekOrigin.Begin)
                            aFileStream.Write(uniEncoding.GetBytes( _
                                recordNumber.ToString()), 0, byteCount)
                            aFileStream.Flush()
                            Console.WriteLine( _
                                "Record has been updated.")

                        ' Catch the IOException generated if the 
                        ' specified part of the file is locked.
                        Catch ex As IOException
                            Console.WriteLine( _
                                "{0}: The write operation could " & _
                                "not be performed because the " & _
                                "specified part of the file is " & _
                                "locked.", ex.GetType().Name)
                        End Try
                        Exit Select

                    ' Lock the specified part of the file.
                    Case "L"C
                        Try
                            aFileStream.Lock(textLength - 1, byteCount)
                            Console.WriteLine("The specified part " & _
                                "of file has been locked.")
                        Catch ex As IOException
                            Console.WriteLine( _
                                "{0}: The specified part of file " & _
                                "is already locked.", _
                                ex.GetType().Name)
                        End Try
                        Exit Select

                    ' Unlock the specified part of the file.
                    Case "U"C
                        Try
                            aFileStream.Unlock( _
                                textLength - 1, byteCount)
                            Console.WriteLine("The specified part " & _
                                "of file has been unlocked.")
                        Catch ex As IOException
                            Console.WriteLine( _
                                "{0}: The specified part of file " & _
                                "is not locked by the current " & _
                                "process.", ex.GetType().Name)
                        End Try
                        Exit Select

                    ' Exit the program.
                    Case Else
                        consoleInput = "X"C
                        Exit While
                End Select
            End While

        Finally
            aFileStream.Close()    
        End Try

    End Sub
End Class

[C#] 
using System;
using System.IO;
using System.Text;

class FStreamLock
{
    static void Main()
    {
        UnicodeEncoding uniEncoding = new UnicodeEncoding();
        string lastRecordText = 
            "The last processed record number was: ";
        int textLength = uniEncoding.GetByteCount(lastRecordText);
        int recordNumber = 13;
        int byteCount = 
            uniEncoding.GetByteCount(recordNumber.ToString());
        string tempString;

        using(FileStream fileStream = new FileStream(
            "Test#@@#.dat", FileMode.OpenOrCreate, 
            FileAccess.ReadWrite, FileShare.ReadWrite))
        {
            // Write the original file data.
            if(fileStream.Length == 0)
            {
                tempString = 
                    lastRecordText + recordNumber.ToString();
                fileStream.Write(uniEncoding.GetBytes(tempString), 
                    0, uniEncoding.GetByteCount(tempString));
            }

            // Allow the user to choose the operation.
            char consoleInput = 'R';
            byte[] readText = new byte[fileStream.Length];
            while(consoleInput != 'X')
            {
                Console.Write(
                    "\nEnter 'R' to read, 'W' to write, 'L' to " + 
                    "lock, 'U' to unlock, anything else to exit: ");

                if((tempString = Console.ReadLine()).Length == 0)
                {
                    break;
                }
                consoleInput = char.ToUpper(tempString[0]);
                switch(consoleInput)
                {
                    // Read data from the file and 
                    // write it to the console.
                    case 'R':
                        try
                        {
                            fileStream.Seek(0, SeekOrigin.Begin);
                            fileStream.Read(
                                readText, 0, (int)fileStream.Length);
                            tempString = new String(
                                uniEncoding.GetChars(
                                readText, 0, readText.Length));
                            Console.WriteLine(tempString);
                            recordNumber = int.Parse(
                                tempString.Substring(
                                tempString.IndexOf(':') + 2));
                        }

                        // Catch the IOException generated if the 
                        // specified part of the file is locked.
                        catch(IOException e)
                        {
                            Console.WriteLine("{0}: The read " +
                                "operation could not be performed " +
                                "because the specified part of the " +
                                "file is locked.", 
                                e.GetType().Name);
                        }
                        break;

                    // Update the file.
                    case 'W':
                        try
                        {
                            fileStream.Seek(textLength, 
                                SeekOrigin.Begin);
                            fileStream.Read(
                                readText, textLength - 1, byteCount);
                            tempString = new String(
                                uniEncoding.GetChars(
                                readText, textLength - 1, byteCount));
                            recordNumber = int.Parse(tempString) + 1;
                            fileStream.Seek(
                                textLength, SeekOrigin.Begin);
                            fileStream.Write(uniEncoding.GetBytes(
                                recordNumber.ToString()), 
                                0, byteCount);
                            fileStream.Flush();
                            Console.WriteLine(
                                "Record has been updated.");
                        }

                        // Catch the IOException generated if the 
                        // specified part of the file is locked.
                        catch(IOException e)
                        {
                            Console.WriteLine(
                                "{0}: The write operation could not " +
                                "be performed because the specified " +
                                "part of the file is locked.", 
                                e.GetType().Name);
                        }
                        break;

                    // Lock the specified part of the file.
                    case 'L':
                        try
                        {
                            fileStream.Lock(textLength - 1, byteCount);
                            Console.WriteLine("The specified part " +
                                "of file has been locked.");
                        }
                        catch(IOException e)
                        {
                            Console.WriteLine(
                                "{0}: The specified part of file is" +
                                " already locked.", e.GetType().Name);
                        }
                        break;

                    // Unlock the specified part of the file.
                    case 'U':
                        try
                        {
                            fileStream.Unlock(
                                textLength - 1, byteCount);
                            Console.WriteLine("The specified part " +
                                "of file has been unlocked.");
                        }
                        catch(IOException e)
                        {
                            Console.WriteLine(
                                "{0}: The specified part of file is " +
                                "not locked by the current process.", 
                                e.GetType().Name);
                        }
                        break;

                    // Exit the program.
                    default:
                        consoleInput = 'X';
                        break;
                }
            }
        }
    }
}

[C++] 
#using <mscorlib.dll>
using namespace System;
using namespace System::IO;
using namespace System::Text;

void main()
{
    UnicodeEncoding* uniEncoding = new UnicodeEncoding();
    String* lastRecordText = 
        S"The last processed record number was: ";
    int textLength = uniEncoding->GetByteCount(lastRecordText);
    int recordNumber = 13;
    int byteCount = 
        uniEncoding->GetByteCount(recordNumber.ToString());
    String* tempString;

    FileStream* fileStream = new FileStream(
        S"Test#@@#.dat", FileMode::OpenOrCreate, 
        FileAccess::ReadWrite, FileShare::ReadWrite);
    try
    {
        // Write the original file data.
        if(fileStream->Length == 0)
        {
            tempString = String::Concat(
                lastRecordText, recordNumber.ToString());
            fileStream->Write(uniEncoding->GetBytes(tempString), 
                0, uniEncoding->GetByteCount(tempString));
        }

        // Allow the user to choose the operation.
        Char consoleInput = 'R';
        Byte readText __gc[] = new Byte __gc[fileStream->Length];
        while(consoleInput != 'X')
        {
            Console::Write(
                S"\nEnter 'R' to read, 'W' to write, 'L' to "  
                S"lock, 'U' to unlock, anything else to exit: ");

            if((tempString = Console::ReadLine())->Length == 0)
            {
                break;
            }
            consoleInput = Char::ToUpper(tempString->get_Chars(0));
            switch(consoleInput)
            {
                // Read data from the file and 
                // write it to the console.
                case 'R':
                    try
                    {
                        fileStream->Seek(0, SeekOrigin::Begin);
                        fileStream->Read(
                            readText, 0, (int)fileStream->Length);
                        tempString = new String(
                            uniEncoding->GetChars(
                            readText, 0, readText->Length));
                        Console::WriteLine(tempString);
                        recordNumber = Int32::Parse(
                            tempString->Substring(
                            tempString->IndexOf(':') + 2));
                    }

                    // Catch the IOException* generated if the 
                    // specified part of the file is locked.
                    catch(IOException* e)
                    {
                        Console::WriteLine(S"{0}: The read " 
                            S"operation could not be performed " 
                            S"because the specified part of the " 
                            S"file is locked.", 
                            e->GetType()->Name);
                    }
                    break;

                // Update the file.
                case 'W':
                    try
                    {
                        fileStream->Seek(textLength, 
                            SeekOrigin::Begin);
                        fileStream->Read(
                            readText, textLength - 1, byteCount);
                        tempString = new String(
                            uniEncoding->GetChars(
                            readText, textLength - 1, byteCount));
                        recordNumber = Int32::Parse(tempString) + 1;
                        fileStream->Seek(
                            textLength, SeekOrigin::Begin);
                        fileStream->Write(uniEncoding->GetBytes(
                            recordNumber.ToString()), 0, byteCount);
                        fileStream->Flush();
                        Console::WriteLine(
                            S"Record has been updated.");
                    }

                    // Catch the IOException* generated if the 
                    // specified part of the file is locked.
                    catch(IOException* e)
                    {
                        Console::WriteLine(
                            S"{0}: The write operation could not " 
                            S"be performed because the specified " 
                            S"part of the file is locked.", 
                            e->GetType()->Name);
                    }
                    break;

                // Lock the specified part of the file.
                case 'L':
                    try
                    {
                        fileStream->Lock(textLength - 1, byteCount);
                        Console::WriteLine(S"The specified part " 
                            S"of file has been locked.");
                    }
                    catch(IOException* e)
                    {
                        Console::WriteLine(
                            S"{0}: The specified part of file is" 
                            S" already locked.", e->GetType()->Name);
                    }
                    break;

                // Unlock the specified part of the file.
                case 'U':
                    try
                    {
                        fileStream->Unlock(
                            textLength - 1, byteCount);
                        Console::WriteLine(S"The specified part " 
                            S"of file has been unlocked.");
                    }
                    catch(IOException* e)
                    {
                        Console::WriteLine(
                            S"{0}: The specified part of file is " 
                            S"not locked by the current process.", 
                            e->GetType()->Name);
                    }
                    break;

                // Exit the program.
                default:
                    consoleInput = 'X';
                    break;
            }
        }
    }
    __finally
    {
        fileStream->Close();
    }
}

[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button Language Filter in the upper-left corner of the page.

Requirements

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

See Also

FileStream Class | FileStream Members | System.IO Namespace | Working with I/O | Reading Text from a File | Writing Text to a File

Show:
© 2014 Microsoft