FileStream.Lock メソッドとは? わかりやすく解説

FileStream.Lock メソッド

読み取りアクセス許可している間に他のプロセスによって FileStream が変更されるのを防ぎます

名前空間: System.IO
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

例外例外
例外種類条件

ArgumentOutOfRangeException

position または length が負の値です。

ObjectDisposedException

ファイル閉じてます。

IOException

別のプロセスファイル位置ロックしているため、このプロセスファイルアクセスできません。

解説解説
使用例使用例

次に示すのは、ファイル一部ロックするコード例です。他のプロセスアクセス試みると、たとえそのファイルへの読み取り/書き込みアクセスがあっても、そのアクセス拒否されます。プログラム複数コマンド ウィンドウ同時に実行しそれぞれに異なコンソール入力オプション使用して結果確認してください

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
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「FileStream.Lock メソッド」の関連用語

FileStream.Lock メソッドのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



FileStream.Lock メソッドのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2024 Microsoft.All rights reserved.

©2024 GRAS Group, Inc.RSS