1. ホーム
  2. windows

[解決済み] メモ帳は全てに勝る?

2022-05-17 19:29:46

質問

Windows Server 2012 R2 システムで、Kotlin プログラムが FileChannel.tryLock() を使ってファイルの排他ロックを保持しています。

val fileRw = RandomAccessFile(file, "rw")
fileRw.channel.tryLock()

このロックがかかった状態で はできません。 でファイルを開くことができます。

  • ワードパッド
  • メモ帳
  • C# でプログラム的に、任意の値の FileShare :

    using (var fileStream = new FileStream(processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var textReader = new StreamReader(fileStream))
    {
        textReader.ReadToEnd();
    }
    
    
  • コマンドラインから type というコマンドを実行します。

    C:\some-directory>type file.txt
    The process cannot access the file because another process has locked a portion of the file.
    
    
  • インターネットエクスプローラー(そう、必死だったんです)

I できます メモ帳で開くことができます。

他の誰にもできないロックされたファイルを、いったいどうやってメモ帳が開けるのでしょうか?

どのように解決するのですか?

メモ帳は、あなたが試した他のエディターで使用されたと思われる通常のファイル読み込みメカニズムではなく、最初にメモリにマッピングすることによってファイルを読み込みます。この方法は、排他的な範囲ベースのロックがある場合でも、ファイルの読み取りを可能にします。

C# では、次のような内容で同じことを実現できます。

using (var f = new FileStream(processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var m = MemoryMappedFile.CreateFromFile(f, null, 0, MemoryMappedFileAccess.Read, null, HandleInheritability.None, true))
using (var s = m.CreateViewStream(0, 0, MemoryMappedFileAccess.Read))
using (var r = new StreamReader(s))
{
    var l = r.ReadToEnd();
    Console.WriteLine(l);
}