Trang chủ » làm thế nào để » Tại sao tôi không thể thay đổi các tệp đang sử dụng trên Windows như tôi có thể trên Linux và OS X?

    Tại sao tôi không thể thay đổi các tệp đang sử dụng trên Windows như tôi có thể trên Linux và OS X?


    Khi bạn đang sử dụng Linux và OS X, hệ điều hành sẽ không ngăn bạn xóa một tệp hiện đang sử dụng trên Windows, bạn sẽ không bị cấm làm như vậy. Đưa cái gì? Tại sao bạn có thể chỉnh sửa và xóa các tệp đang sử dụng trên các hệ thống có nguồn gốc Unix mà không phải Windows?

    Phiên hỏi và trả lời hôm nay đến với chúng tôi nhờ sự hỗ trợ của SuperUser - một phân ngành của Stack Exchange, một nhóm các trang web Hỏi & Đáp do cộng đồng điều khiển.

    Câu hỏi

    Trình đọc SuperUser the.midget muốn biết tại sao Linux và Windows lại xử lý các tệp đang sử dụng khác nhau:

    Một trong những điều khiến tôi bối rối kể từ khi tôi bắt đầu sử dụng Linux là nó cho phép bạn thay đổi tên của một tệp hoặc thậm chí xóa nó trong khi nó đang được đọc. Một ví dụ là cách tôi vô tình cố gắng xóa video khi đang phát. Tôi đã thành công và rất ngạc nhiên khi tôi biết rằng bạn có thể thay đổi bất cứ thứ gì trong một tệp mà không cần quan tâm liệu nó có được sử dụng vào lúc này hay không.

    Vì vậy, những gì xảy ra đằng sau hậu trường và ngăn anh ta xóa bỏ mọi thứ trong Windows như anh ta có thể trong Linux?

    Câu trả lời

    Những người đóng góp SuperUser làm sáng tỏ tình hình cho the.midget. Kinh ngạc viết:

    Bất cứ khi nào bạn mở hoặc thực thi một tệp trong Windows, Windows sẽ khóa tệp tại chỗ (đây là một sự đơn giản hóa, nhưng thường là đúng.) Một tệp bị khóa bởi một quy trình có thể bị xóa cho đến khi quá trình đó giải phóng nó. Đây là lý do tại sao bất cứ khi nào Windows phải tự cập nhật, bạn cần khởi động lại để nó có hiệu lực.

    Mặt khác, các hệ điều hành giống Unix như Linux và Mac OS X không khóa tệp mà thay vào đó là các thành phần đĩa bên dưới. Điều này có vẻ khác biệt nhỏ nhưng điều đó có nghĩa là bản ghi của tệp trong bảng nội dung của hệ thống tệp có thể bị xóa mà không làm phiền bất kỳ chương trình nào đã mở tệp. Vì vậy, bạn có thể xóa một tệp trong khi nó vẫn đang thực thi hoặc đang sử dụng và nó sẽ tiếp tục tồn tại trên đĩa miễn là một số quy trình có xử lý mở cho nó ngay cả khi mục nhập của nó trong bảng tệp đã biến mất.

    David Schwartz mở rộng ý tưởng và nêu bật cách mọi thứ nên lý tưởng và cách chúng hoạt động:

    Windows mặc định để tự động, khóa tập tin bắt buộc. UNIX mặc định để thủ công, khóa tập tin hợp tác. Trong cả hai trường hợp, mặc định có thể được ghi đè, nhưng trong cả hai trường hợp, chúng thường không.

    Rất nhiều mã Windows cũ sử dụng API C / C ++ (các chức năng như fopen) thay vì API gốc (các chức năng như CreatFile). API C / C ++ cung cấp cho bạn không có cách nào để chỉ định cách khóa bắt buộc sẽ hoạt động, do đó bạn nhận được mặc định. Chế độ chia sẻ mặc định của Wap có xu hướng cấm các hoạt động xung đột của Wap. Nếu bạn mở một tệp để viết, ghi được coi là xung đột, ngay cả khi bạn không bao giờ thực sự ghi vào tệp. Ditto cho đổi tên.

    Và, đây là nơi nó trở nên tồi tệ hơn. Ngoài việc mở để đọc hoặc ghi, API C / C ++ không cung cấp cách nào để chỉ định những gì bạn định làm với tệp. Vì vậy, API phải cho rằng bạn sẽ thực hiện bất kỳ hoạt động hợp pháp nào. Vì việc khóa là bắt buộc, một mở cho phép một hoạt động xung đột sẽ bị từ chối, ngay cả khi mã không bao giờ có ý định thực hiện thao tác xung đột mà chỉ mở tệp cho mục đích khác.

    Vì vậy, nếu mã sử dụng API C / C ++ hoặc sử dụng API gốc mà không suy nghĩ cụ thể về các vấn đề này, họ sẽ ngăn chặn tập hợp tối đa các hoạt động có thể có cho mọi tệp họ mở và không thể mở tệp trừ khi mọi thao tác có thể xảy ra có thể thực hiện trên nó một khi đã mở là không tin.

    Theo tôi, phương pháp Windows sẽ hoạt động tốt hơn nhiều so với phương pháp UNIX nếu mọi chương trình chọn chế độ chia sẻ và chế độ mở một cách khôn ngoan và xử lý triệt để các trường hợp thất bại. Tuy nhiên, phương thức UNIX hoạt động tốt hơn nếu mã không bận tâm để nghĩ về những vấn đề này. Thật không may, API C / C ++ cơ bản không ánh xạ tốt vào API tệp Windows theo cách xử lý các chế độ chia sẻ và xung đột mở tốt. Vì vậy, kết quả mạng là một chút lộn xộn.

    Bạn có nó: hai cách tiếp cận khác nhau để xử lý tệp mang lại hai kết quả khác nhau.


    Có một cái gì đó để thêm vào lời giải thích? Tắt âm thanh trong các ý kiến. Bạn muốn đọc thêm câu trả lời từ những người dùng Stack Exchange am hiểu công nghệ khác? Kiểm tra chủ đề thảo luận đầy đủ ở đây.