code

메모장이 다 이긴다고요?

starcafe 2023. 4. 13. 21:00
반응형

메모장이 다 이긴다고요?

Windows Server 2012 R2 시스템에서 Kotlin 프로그램은 다음과 같이 파일에 대한 배타적 잠금을 유지하기 위해 사용합니다.

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();
    }
    
  • 명령줄에서 명령어는 다음과 같습니다.

    C:\some-directory>type file.txt
    The process cannot access the file because another process has locked a portion of the file.
    
  • Internet Explorer(네, 필사적이었어요)

메모장으로 열 수 있어요.

어떻게 메모장이 다른 어떤 것도 열 수 없는 잠긴 파일을 열 수 있을까요?

메모장은 다른 편집자가 사용한 "일반적인" 파일 읽기 메커니즘을 사용하지 않고 먼저 메모리에 파일을 매핑하여 파일을 읽습니다.이 방법을 사용하면 범위 기반 잠금이 배타적이어도 파일을 읽을 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/45644934/notepad-beats-them-all

반응형