2009-02-13 48 views
13

Ngôn ngữ sử dụng: C#Xóa trên các tập tin gần

Theory: Tôi muốn tạo ra một tập tin với FileOptions.DeleteOnClose cờ trong một thư mục tạm thời. Tệp được tạo thành công và tôi ghi dữ liệu lên đó, bước tiếp theo là khởi chạy ứng dụng được liên kết với tệp Process.Start (...) và cho phép người dùng kiểm tra tài liệu, cuối cùng tôi đóng trình xử lý của tôi và ngay sau đó như quá trình khác đóng xử lý vào tập tin tạm thời, tập tin sẽ bị xóa bởi hệ điều hành.

Vấn đề của tôi là các quy trình khác không thể mở tệp, ngay cả khi đọc, mặc dù nếu tôi thêm FileShare.ReadWrite | FileShare.Delete sang chế độ chia sẻ.

Mọi đề xuất?

Trả lời

17

Các quá trình khác cần phải xác định FileShare.Delete khi họ mở DeleteOnClose tập tin

Từ MSDN CreateFile tài liệu:

"FILE_FLAG_DELETE_ON_CLOSE ... yêu cầu mở tiếp theo cho các tập tin thất bại, trừ khi chế độ FILE_SHARE_DELETE cổ phiếu được quy định."

+0

Ok, tôi nên đọc tài liệu MSDN. Cảm ơn câu trả lời. Tôi sẽ giải quyết vấn đề bằng cách sử dụng ứng dụng màn hình, khi quá trình chấm dứt tôi xóa tệp tạm thời. – xoreax

-6

Chuyển sang Linux Hội đồng này

Ok, nghiêm túc bây giờ: Đó là một lỗ hổng trong hệ điều hành Windows có thể không thực sự được làm việc xung quanh. Mỗi chương trình mở tệp phải đồng ý với các chương trình khác có tệp mở trong cùng một thời điểm. Đó là một vấn đề tôi đã có nhiều năm trở lại khi tôi vẫn còn sử dụng Windows là tốt. Nó không đủ để mở một tập tin và nói: Hãy để bất cứ ai khác mở này là tốt. Những người khác cũng phải nói mở tập tin này ngay cả khi nó đã được mở.

Trên Linux ngược lại, hệ điều hành không cho phép bất kỳ tệp nào bị khóa theo cách Windows thực hiện. Ở đây, nếu bất kỳ tập tin nào được sử dụng bởi nhiều chương trình cùng một lúc, chính chương trình phải đảm bảo rằng các truy cập đồng thời sẽ bị khóa. Ngoài ra, trên Linux, chúng tôi chỉ có thể tạo tệp, đảm bảo quá trình khác đã được bắt đầu và mở tệp và sau đó chỉ cần xóa tệp (trong khi tệp đang mở). Tên tập tin sau đó được gỡ bỏ khỏi hệ thống tập tin immediatelly, nhưng tập tin vẫn được duy trì bởi trình điều khiển hệ thống tập tin cho đến khi liên kết cuối cùng (bao gồm cả các tập tin mở) bị loại bỏ.

Về vấn đề của bạn: Như tất cả những điều này doen't làm việc trên Windows, bạn có thể làm hai cách tiếp cận khác:

  1. đăng ký các tập tin bị xóa khi khởi động tiếp theo (trong những ngày Win3x, đã có một phần trong win.ini cho điều đó. Phiên bản Windows mới hơn vẫn hỗ trợ điều đó, tôi không thể nhớ lại nữa, cách nó được thực hiện ngay bây giờ).
  2. Bắt đầu quá trình khác, chờ cho nó để mở file, đóng file và sau đó cố gắng từng phút để xóa các tập tin cho đến khi xóa thành công ...

Kính trọng, Bodo

+1

Nhưng Unix nói chung (không chắc chắn về Linux, nhưng có lẽ cả Linux nữa) không có tùy chọn 'xóa khi tệp được đóng cửa cuối cùng'. –

+1

Đó là vì bạn có thể xóa nó ngay cả khi nó đang mở. Miễn là tất cả những ai cần nó đều có tay cầm, mọi thứ sẽ diễn ra. –

-1

tôi muốn tạo tệp có gắn cờ FileOptions.DeleteOnĐóng trong thư mục tạm thời .

Tôi đóng bộ xử lý của mình và ngay sau khi quá trình đóng bộ xử lý này vào tệp tạm thời, tệp sẽ bị xóa bởi hệ điều hành .

Vui lòng giải thích. Làm thế nào là tập tin này đã bị xóa bởi hệ điều hành. Nếu bạn có nghĩa là loại bỏ nó bằng mã. Tại sao không lưu tập tin. Sau đó, bạn có thể mở nó bằng Process.Bắt đầu

+0

Đây là một tùy chọn trên Windows - được thảo luận gần đây trong một câu hỏi SO khác mà hiện tại tôi không thể xác định được. –

0

Kiểm tra này:

Bạn cần phải chắc chắn rằng tất cả quá trình đang mở các tập tin với FileShare.ReadWrite và FileShare.Delete.

Ngay cả khi người sáng tạo mở bằng ghi đè chia sẻ, nếu chương trình thứ hai cố gắng mở bằng chia sẻ, chương trình thứ hai về cơ bản nói rằng không ai khác có thể viết. Nhưng chương trình đầu tiên đã có sức mạnh để mở thứ hai thất bại.

+0

Tuy nhiên, người tạo có thể tạo tệp, sau đó đóng tệp và mở lại bằng Chia sẻ chỉ đọc. Cuối cùng, vấn đề nằm ở chỗ không thực sự có tệp mở bởi hai tiến trình đồng thời, nhưng trong câu hỏi làm thế nào để thực hiện autodelete đó. –

+1

bothie, hệ điều hành sẽ xóa tệp ngay lập tức nó đóng, do đó, mở lại của bạn sẽ thất bại. – paxdiablo

Các vấn đề liên quan