FileStream.Lock-Methode
Verhindert, dass andere Prozesse den FileStream ändern, während gleichzeitig Lesezugriff gewährt wird.
Namespace: System.IO
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
Public Overridable Sub Lock ( _
position As Long, _
length As Long _
)
'Usage
Dim instance As FileStream
Dim position As Long
Dim length As Long
instance.Lock(position, length)
public virtual void Lock (
long position,
long length
)
public:
virtual void Lock (
long long position,
long long length
)
public void Lock (
long position,
long length
)
public function Lock (
position : long,
length : long
)
Parameter
- position
Der Anfang des zu sperrenden Bereichs. Der Wert dieses Parameters muss größer oder gleich 0 sein.
- length
Der zu sperrende Bereich.
Ausnahmen
Ausnahmetyp | Bedingung |
---|---|
position oder length ist negativ. |
|
Die Datei ist geschlossen. |
|
Der Prozess kann nicht auf die Datei zugreifen, weil ein Teil der Datei von einem anderen Prozess gesperrt wird. |
Hinweise
In der folgenden Tabelle sind Beispiele für andere typische oder verwandte E/A-Aufgaben aufgeführt.
Aufgabe |
Beispiel in diesem Thema |
---|---|
Erstellen einer Textdatei. |
|
In eine Textdatei schreiben. |
|
Aus einer Textdatei lesen. |
|
Text an eine Datei anfügen. |
|
Eine Datei umbenennen oder verschieben. |
|
Eine Datei kopieren. |
|
Die Größe eines Verzeichnisses abrufen. |
|
Die Attribute einer Datei abrufen. |
|
Die Attribute einer Datei festlegen. |
|
Ein Unterverzeichnis erstellen. |
|
Aus einer Binärdatei lesen. |
Gewusst wie: Lesen und Schreiben einer neu erstellten Datendatei |
In eine Binärdatei schreiben. |
Gewusst wie: Lesen und Schreiben einer neu erstellten Datendatei |
Anzeigen der Dateien in einem Verzeichnis. |
|
Sortieren von Dateien in einem Verzeichnis nach Größe. |
Beispiel
Das folgende Codebeispiel veranschaulicht das Sperren eines Teils einer Datei vor dem Zugriff durch andere Prozesse, einschließlich Prozessen mit Lese- und Schreibzugriff auf die Datei. Führen Sie das Programm gleichzeitig an mehreren Eingabeaufforderungen aus, und testen Sie die verschiedenen Konsoleneingabeoptionen.
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
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;
}
}
}
}
}
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();
}
}
import System.*;
import System.IO.*;
import System.Text.*;
class FStreamLock
{
public static void main(String[] args)
{
UnicodeEncoding uniEncoding = new UnicodeEncoding();
String lastRecordText = "The last processed record number was: ";
int textLength = uniEncoding.GetByteCount(lastRecordText);
int recordNumber = 13;
int byteCount = uniEncoding.GetByteCount(
(new Integer(recordNumber)).ToString());
String tempString;
FileStream fileStream = new FileStream
("Test#@@#.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite,
FileShare.ReadWrite);
try {
// Write the original file data.
if ( fileStream.get_Length() == 0 ) {
tempString = lastRecordText +(
new Integer( recordNumber)).ToString();
fileStream.Write(uniEncoding.GetBytes(tempString),
0, uniEncoding.GetByteCount(tempString));
}
// Allow the user to choose the operation.
char consoleInput = 'R';
ubyte readText[] = new ubyte[(int) fileStream.get_Length() ];
while((consoleInput != 'X')) {
Console.Write(("\nEnter 'R' to read,'W' to write, 'L' to "
+ "lock, 'U' to unlock, anything else to exit: "));
if (((String)(tempString =
Console.ReadLine())).get_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.get_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("{0}: The read "
+ "operation could not be performed "
+ "because the specified part of the "
+ "file is locked.", e.GetType().get_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(
(new Integer( 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().get_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().get_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().get_Name());
}
break;
// Exit the program.
default :
// Exit the program.
consoleInput = 'X';
break;
}
}
}
finally {
fileStream.Dispose();
}
} //main
} //FStreamLock
Plattformen
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
Siehe auch
Referenz
FileStream-Klasse
FileStream-Member
System.IO-Namespace
Weitere Ressourcen
Datei- und Stream-E/A
Gewusst wie: Lesen aus einer Textdatei
Gewusst wie: Schreiben von Text in eine Datei