メモ帳はそれらすべてを打つ?


134

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.
    
  • Internet Explorer(はい、私は絶望的でした)

私がすることができ、メモ帳で開きます。

どのようにしてメモ帳でロックされたファイルを開くことができるのでしょうか。

回答:


202

メモ帳は、おそらく他の編集者が使用した「通常の」ファイル読み取りメカニズムを使用するのではなく、最初にファイルをメモリにマッピングしてファイルを読み取ります。この方法では、範囲ベースの排他ロックが設定されているファイルでも読み取ることができます。

あなたは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);
}

58
することで、より詳細に確認し、Microsoftのレイモンド・チェンファイルをロードするには、メモ帳は、そのソースとしてメモリマップドファイルおよび用途として、ファイルのビューをマップします。コードはエンコードを計算し、必要に応じてコードページをUTF-16LEに変換し、結果をメモリブロックに入れ、EM_SETHANDLEメッセージを使用してそのブロック全体を編集コントロールに渡します。
Stevoisiak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.