web-dev-qa-db-ja.com

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

Windows Server 2012 R2システムでは、Kotlinプログラムは FileChannel.tryLock() を使用して、ファイルに排他ロックをかけます。

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

このロックが設定されていると、Iでファイルを開くことはできません

  • ワードパッド
  • メモ帳++
  • FileShareの任意の値に対して、C#を使用してプログラム的に:

    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(はい、私は必死でした)

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

メモ帳がロックファイルを開くことができる方法は他にありません。

125
MonoThreaded

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

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);
}
189
Iridium