FileStream::Unlock Method (Int64, Int64)
Allows access by other processes to all or part of a file that was previously locked.
Assembly: mscorlib (in mscorlib.dll)
Parameters
- position
-
Type:
System::Int64
The beginning of the range to unlock.
- length
-
Type:
System::Int64
The range to be unlocked.
| Exception | Condition |
|---|---|
| ArgumentOutOfRangeException | position or length is negative. |
For a list of common file and directory operations, see Common I-O Tasks.
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, and then unlock the specified part of the file . Run the program simultaneously in different command windows and investigate using the different console input options.
using namespace System; using namespace System::IO; using namespace System::Text; int main() { UnicodeEncoding^ uniEncoding = gcnew 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; FileStream^ fileStream = gcnew FileStream( "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'; array<Byte>^readText = gcnew array<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 ) { case 'R': try { fileStream->Seek( 0, SeekOrigin::Begin ); fileStream->Read( readText, 0, (int)fileStream->Length ); tempString = gcnew 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( "{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 = gcnew 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( "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; default: // Exit the program. consoleInput = 'X'; break; } } } finally { fileStream->Close(); } }
Available since 1.1