메모장이 모두를 능가합니까?


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
보다 구체적으로 확인 된 마이크로 소프트의 레이몬드 첸 : 파일을로드하려면 메모장은 소스로 메모리 매핑 된 파일을 사용하기 때문에 파일의보기를 매핑합니다. 코드는 인코딩을 파악하고 필요한 경우 UTF-16LE로 코드 페이지 변환을 수행하고 결과를 메모리 블록에 넣은 다음 EM_SETHANDLE 메시지를 사용하여 해당 블록 전체를 편집 컨트롤에 전달합니다.
Stevoisiak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.