FileStream.Lock 方法

允许读取访问的同时防止其他进程更改 FileStream

**命名空间:**System.IO
**程序集:**mscorlib(在 mscorlib.dll 中)

语法

声明
Public Overridable Sub Lock ( _
    position As Long, _
    length As Long _
)
用法
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
)

参数

  • position
    要锁定的范围的开始处。此参数的值必须大于或等于零 (0)。
  • length
    要锁定的范围。

异常

异常类型 条件

ArgumentOutOfRangeException

position 或 length 为负。

ObjectDisposedException

文件被关闭。

IOException

由于另一个进程已锁定文件的部分内容,因此该进程无法访问该文件。

备注

下表列出了其他典型或相关的 I/O 任务的示例。

若要执行此操作...

请参见本主题中的示例...

创建文本文件。

如何:向文件写入文本

写入文本文件。

如何:向文件写入文本

读取文本文件。

如何:从文件读取文本

向文件中追加文本。

如何:打开并追加到日志文件

File.AppendText

FileInfo.AppendText

重命名或移动文件。

File.Move

FileInfo.MoveTo

复制文件。

File.Copy

FileInfo.CopyTo

获取目录的大小。

FileInfo.Length

获取文件属性。

File.GetAttributes

设置文件属性。

File.SetAttributes

创建子目录。

CreateSubdirectory

读取二进制文件。

如何:对新建的数据文件进行读取和写入

写入二进制文件。

如何:对新建的数据文件进行读取和写入

查看目录中的文件。

Name

按大小对目录中的文件排序。

GetFileSystemInfos

示例

下面的代码示例阐释了如何通过相应地锁定一个文件的某个部分,使其他进程即使对该文件有读/写访问权限也无法访问该文件的这一部分。同时在不同的命令窗口中运行该程序,研究如何使用不同的控制台输入选项。

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

平台

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 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求

版本信息

.NET Framework

受以下版本支持:2.0、1.1、1.0

请参见

参考

FileStream 类
FileStream 成员
System.IO 命名空间

其他资源

文件和流 I/O
如何:从文件读取文本
如何:向文件写入文本