2009-02-13 176 views
13

使用語言:C#刪除在關閉文件

理論: 我想創建一個臨時文件夾的標誌FileOptions.DeleteOnClose的文件。 該文件已成功創建並向其寫入數據,下一步是啓動與文件Process.Start(...)關聯的應用程序並允許用戶檢查文檔,最後關閉手柄並儘快當其他進程關閉臨時文件的句柄時,該文件被操作系統刪除。

我的問題是其他進程無法打開該文件,即使閱讀,儘管如果我添加FileShare.ReadWrite | FileShare.Delete到共享模式。

有什麼建議嗎?

回答

17

的其他進程需要指定FileShare.Delete,當他們打開DeleteOnClose文件

MSDN CreateFile文檔:

FILE_FLAG_DELETE_ON_CLOSE ......隨後打開該文件請求失敗,除非FILE_SHARE_DELETE共享模式被指定「。

-6

切換到Linux SCNR

好了,現在認真:這是在Windows操作系統無法真正圍繞工作中的缺陷。打開文件的每個程序必須同意其他程序在同一時間打開該文件。當我仍然使用Windows時,這是我多年以前遇到的一個問題。打開一個文件並說:讓其他人也打開這個文件是不夠的。其他人也必須說打開這個文件,即使它已經打開。

在Linux上,相反,操作系統不允許任何文件鎖定Windows的方式。在這裏,如果任何文件被多個程序同時使用,程序本身必須確保併發訪問被鎖定。另外,在Linux上,我們可以創建文件,確保其他進程已經啓動並打開文件,然後刪除文件(打開文件時)。文件名將立即從文件系統中刪除,但該文件仍由文件系統驅動程序維護,直到最後一個鏈接(包括打開的文件句柄)被刪除。

回到你的問題:由於這一切在Windows doen't工作,你可以做其他兩種方法:

  1. 註冊文件要在下次啓動時刪除(在WIN3X天,有在win.ini中的一個部分,較新的Windows版本仍然支持這一點,我只是不記得了,現在是如何完成的)。
  2. 啓動其他進程,等待它打開該文件,關閉該文件,然後嘗試每分鐘要刪除的文件,直到刪除成功...

問候,博多

+1

但是一般的Unix(不是Linux的某些特性,也可能是Linux)沒有'delete when file finally finally'選項。 – 2009-02-13 14:35:54

+1

這是因爲即使打開它也可以刪除它。只要每個需要它的人都有處理,事情就會解決。 – 2009-02-13 14:46:26

-1

我想要創建一個帶有標誌的文件 FileOptions.DeleteOnClosed在 臨時文件夾中。

我閉上我的把手,一旦其他 過程中關閉句柄 臨時文件,該文件被 操作系統中刪除。

請詳細說明。這個文件如何被操作系統刪除。如果你的意思是通過代碼刪除它。爲什麼不保存文件流。然後你可以用Process打開它。啓動

+0

它是Windows上的一個選項 - 最近在另一個SO問題中討論過,我現在找不到它。 – 2009-02-13 14:35:14

0

檢查:

你需要確保所有過程正在打開與FileShare.ReadWrite和FileShare.Delete文件。

即使創建者使用share-readwrite打開,如果第二個程序試圖用share-read打開,第二個程序基本上是說沒人能寫。但是第一個程序已經擁有了這個能力,所以第二個程序就會失敗

+0

但是,創建者可以創建該文件,然後關閉它並使用共享只讀重新打開該文件。最後,問題並不在於由兩個進程同時打開該文件,而在於如何實現該自動刪除。 – 2009-02-13 15:12:47