Tại sao tôi không thể thay đổi tên của tệp đang đọc trên Windows như tôi có thể làm trên Linux / Mac?


23

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 tin 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.


2
Đổi tên một tệp bị khóa không phải là một vấn đề trên Windows. Xóa thường là, có một vài chương trình mở tệp với tùy chọn FILE_SHARE_DELETE được bật.
Hans Passant

Bạn thực sự đã không xóa nó, bạn chỉ hủy liên kết nó khỏi thư mục chứa nó. Tập tin vẫn tồn tại, nó chỉ có thể không có bất kỳ tên nào trong hệ thống tập tin. (Mặc dù nó vẫn có một tên trong /prochệ thống tệp thông qua chương trình đã mở.) Một tệp chỉ có thể thực sự bị xóa nếu không còn tham chiếu nào cho nó và điều này tự động xảy ra.
David Schwartz

Câu trả lời:


36

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 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 không còn nữa.


2
Cảm ơn câu trả lời này. Nó giải thích sự khác biệt với tôi nhiều hơn nữa. Nó cũng giúp giải thích lý do tại sao tải các tệp / video lớn không chiếm dung lượng RAM lớn. Nếu không, phát một video lớn có thể làm hỏng toàn bộ hệ thống của bạn.
Jerry Saravia

4
Nếu bạn đã xóa một tệp đang sử dụng và bạn muốn lấy lại nó trên Linux, bạn có thể tìm thấy mục nhập của tệp trong / Proc, như được mô tả trong câu hỏi này .
Ken Bloom

2
Đây là một phần của sự khái quát hóa - không phải tất cả các bản cập nhật Windows ngày nay (trên Windows 7) đều yêu cầu khởi động lại và tôi đã làm rất nhiều trên Linux.
Alan B

10

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ư CreateFile). 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ó xu hướng cấm các hoạt động "xung đột". 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. Khác vớ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. Kể từ khi khóa là bắt buộc, một opencho phép một hoạt động mâu thuẫn sẽ bị từ chối, thậm chí nếu mã không bao giờ có ý định để thực hiện các hoạt động mâu thuẫn nhưng chỉ mở tập tin 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.


0

Đây là một câu hỏi rất thú vị và nó đã khiến tôi suy nghĩ về một câu trả lời khả thi. Tôi hy vọng những người khác có thể cung cấp sao lưu ở đây.

Tôi sử dụng cả Windows và Linux và cũng nhận thấy điều này. Tôi cũng là một người sử dụng vim. Vim sẽ đọc tệp văn bản vào 'bộ đệm' hoặc RAM, sau đó không chạm vào tệp thực tế cho đến khi bạn lưu. Linux có thể đang thực hiện loại hành động này nói chung với tất cả các tệp.

Lấy video của bạn làm ví dụ, nó đọc video, tất cả nếu có thể, vào RAM, và sau đó bạn có một bản sao của video có thể dễ dàng truy cập, có thể tìm kiếm, có thể nhảy. Nếu tệp quá lớn thì bạn có thể gặp sự cố vì Linux có thể không đọc toàn bộ video, có thể chỉ là một đoạn lớn. Khi trình phát của bạn đến cuối video được đệm, nó sẽ cố đọc lại tệp. Nếu bạn đã xóa video thì điều đó thật tệ cho bạn.

Windows là một hệ điều hành "an toàn hơn" trong một số trường hợp vì nó sẽ không cho phép bạn làm điều đó. Nó có thể đệm các tệp theo cách tương tự như Linux nhưng cũng thêm khóa tệp để ngăn bạn hoặc các chương trình khác thay đổi các tệp bạn đang làm việc hoặc xem. Điều này giúp giữ cho tệp nguyên vẹn và giữ cho bạn hoặc các chương trình khác ghi đè lên các thay đổi của nhau.


Bạn thực sự không thể xóa nó. Chỉ cần di chuyển nó và đổi tên nó.
Daniel Beck

2
Bạn có thể 'rm' nó. Nó đủ gần để xóa nó.
Chris Moore
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.