Notepad đánh bại tất cả?


134

Trên hệ thống Windows Server 2012 R2, chương trình Kotlin sử dụng FileChannel.tryLock()để giữ khóa độc quyền trên một tệp, như sau:

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

Với khóa này tại chỗ, tôi không thể mở tệp bằng:

  • Wordman
  • Notepad ++
  • Lập trình với C #, cho bất kỳ giá trị nào của FileShare:

    using (var fileStream = new FileStream(processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var textReader = new StreamReader(fileStream))
    {
        textReader.ReadToEnd();
    }
  • Từ dòng lệnh, typelệnh:

    C:\some-directory>type file.txt
    The process cannot access the file because another process has locked a portion of the file.
  • Internet Explorer (vâng, tôi đã tuyệt vọng)

Tôi có thể mở nó bằng Notepad.

Làm thế nào quái là Notepad có thể mở một tập tin bị khóa mà không có gì khác có thể?

Câu trả lời:


202

Notepad đọc các tệp bằng cách trước tiên ánh xạ chúng vào bộ nhớ, thay vì sử dụng các cơ chế đọc tệp "thông thường" có lẽ được sử dụng bởi các trình soạn thảo khác mà bạn đã thử. Phương pháp này cho phép đọc tệp ngay cả khi chúng có khóa dựa trên phạm vi độc quyền.

Bạn có thể đạt được điều tương tự trong C # với một cái gì đó dọc theo dòng:

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
Xác nhận chi tiết hơn bởi Raymond Chen của Microsoft : Để tải tệp, Notepad ánh xạ chế độ xem tệp dưới dạng tệp ánh xạ bộ nhớ và sử dụng tệp đó làm nguồn. Mã chỉ ra mã hóa, thực hiện chuyển đổi trang mã thành UTF-16LE nếu cần, đặt kết quả vào khối bộ nhớ và sau đó sử dụng thông báo EM_SETHANDLE để trao toàn bộ khối đó cho điều khiển chỉnh sửa.
Stevoisiak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.