Notepad เต้นได้ทั้งหมด?


135

ในระบบ Windows Server 2012 R2 โปรแกรม Kotlin ใช้FileChannel.tryLock()เพื่อล็อคไฟล์แบบเอกสิทธิ์เฉพาะบุคคลเช่นนี้:

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

ด้วยการล็อคนี้ฉันไม่สามารถเปิดไฟล์ด้วย:

  • WordPad
  • Notepad ++
  • โดยใช้โปรแกรม 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 (ใช่ฉันหมดหวังแล้ว)

ฉันสามารถเปิดมันด้วย Notepad

วิธีที่ Notepad สามารถเปิดไฟล์ที่ถูกล็อกซึ่งไม่มีอะไรสามารถทำได้?

คำตอบ:


203

Notepad อ่านไฟล์โดยการแมปไฟล์ลงในหน่วยความจำก่อนแทนที่จะใช้กลไกการอ่านไฟล์ "ตามปกติ" ที่น่าจะใช้โดยโปรแกรมแก้ไขอื่น ๆ ที่คุณพยายาม วิธีนี้ช่วยให้อ่านไฟล์ได้แม้ว่าจะมีการล็อกแบบอิงตามช่วงเฉพาะก็ตาม

คุณสามารถบรรลุสิ่งเดียวกันใน 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);
}

59
ได้รับการยืนยันในรายละเอียดเพิ่มเติมโดยRaymond Chen ของ Microsoft : ในการโหลดไฟล์ Notepad จะแมปมุมมองของไฟล์เป็นไฟล์ที่แมปหน่วยความจำและใช้ไฟล์นั้นเป็นแหล่งที่มา รหัสจะแสดงการเข้ารหัสทำการแปลงโค้ดเพจเป็น UTF-16LE หากจำเป็นวางผลลัพธ์ไว้ในบล็อกหน่วยความจำจากนั้นใช้ข้อความ EM_SETHANDLE เพื่อส่งบล็อกทั้งหมดนั้นไปยังตัวควบคุมการแก้ไข
Stevoisiak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.