2009-02-13 152 views
17

UNIX文件鎖定是死簡單:操作系統假設你知道你在做什麼,讓你做你想要什麼:如何使Windows文件鎖定更像UNIX文件鎖定?

例如,如果您嘗試刪除其另一個進程已打開的文件操作系統通常會讓你這樣做。原始進程仍然保留它的文件句柄直到它終止 - 此時文件系統將悄悄地重新循環磁盤資源。沒有大驚小怪,這就是我喜歡的方式。

Windows上的不同之處:如果我嘗試刪除另一個進程正在使用的文件,則會收到操作系統錯誤。該文件是不可觸摸的,直到原始進程釋放它對文件的鎖定。在MS-DOS的單用戶日期,當任何鎖定過程可能位於包含這些文件的同一臺計算機上時,這是非常棒的事情,但是在網絡中它是一場噩夢:

考慮當進程掛起時會發生什麼同時寫入Windows文件服務器上的共享文件。在可以刪除文件之前,我們必須找到計算機並在最初打開該文件的那臺計算機上標識該進程。只有這樣我們才能殺死進程並刪除我們不需要的文件。

真是太討厭了!

有沒有辦法讓這個更好?我想要的是在Windows上進行文件鎖定,使其在UNIX中的行爲類似於文件鎖定。我希望操作系統能夠讓我做我想做的事情,因爲我負責並且知道自己在做什麼......

......所以可以這樣做嗎?

+0

我嚴重懷疑它。操作系統中的程序可以繼續訪問已刪除文件直到關閉它的Unix行爲是深刻的。 – 2009-02-13 16:09:31

+0

對我來說,文件鎖定意味着使用fcntl和LockFileEx。您正在詢問是否有權打開或刪除文件。 – 2009-02-13 16:49:50

回答

8

根據MSDN可以指定的CreateFile()第三參數(dwSharedMode)共享模式標誌FILE_SHARE_DELETE其中:

啓用上的文件或設備的後續的打開操作,以請求刪除訪問。

否則,其他進程無法打開該文件或設備,如果他們請求刪除訪問。

如果未指定此標誌,但文件或設備已被打開以進行刪除訪問,則該功能失敗。

注刪除訪問權限允許刪除和重命名操作。

http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

所以,如果你能控制你的應用程序,你可以使用此標誌。

+0

這不是一種提供類Unix的解除鏈接的萬能藥。它只允許其他File對象引用來重命名文件或設置/取消設置其刪除處置。設置刪除處置不會取消鏈接文件。文件系統驅動程序的清理例程僅在最後一個句柄關閉時纔會取消鏈接文件。這與Unix有很大的不同之處在於當試圖刪除一個包含正在使用的文件的目錄時。假設這些文件是使用刪除共享打開的,解決方法是將它們重命名爲同一捲上的臨時目錄。 – eryksun 2017-10-19 15:36:36

7

編號Windows是爲「普通用戶」設計的,也就是那些對電腦不瞭解的人。因此,操作系統會盡量避免使用PEBKAC。引用比爾蓋茨的話:「Windows沒有任何問題需要修復。」當然,他知道99.9999%的Windows用戶無法分辨出該程序是否因爲他們或寫這個程序的人而做了些奇怪的事情。

Unix的設計是當世界變得更加簡單,任何人都足夠接近電腦來觸摸它,可能知道如何從髒沙中組裝它。因此,操作系統通常會讓你做你想做的事情,因爲它假設你知道的更好(如果你沒有,你會下一次)。

技術答案:如果你創建一個文件,Unix會分配一個「i-nodes」。 I節點可以在進程之間共享。如果兩個進程創建相同的文件(也就是說,兩個進程使用相同的路徑調用create()),那麼最終會有兩個i節點。這是設計。它允許一個奇特的安全功能:您可以創建一個沒有人可以打開的文件,但你自己:

  1. 打開文件
  2. 將其刪除(但保持文件句柄)
  3. 使用的文件,無論如何你像
  4. 關閉文件

第2步後,誰可以訪問該文件宇宙中唯一的過程是誰創造了它(除非你想讀塊硬盤塊)之一。操作系統會保持數據的活動狀態,直到你關閉文件或者進程終止(在這之後Unix將會清理掉)。

這種設計是所有Unix文件系統的基礎。 Windows文件系統NTFS的工作方式大致相同,但高級API不同。許多應用程序以獨佔模式打開文件(防止任何人,甚至備份程序)讀取文件。對於只顯示諸如PDF查看器之類的信息的應用程序,情況更是如此。

這意味着你將必須解決所有的Windows應用程序達到預期的效果。如果您有權訪問源,則可以使用共享模式創建文件。這將允許其他進程在同一時間訪問,但屆時,你將有充分的讀前檢查/寫,如果該文件仍然存在,是否有人進行更改,等等

+1

我不認爲這是如何工作的。同一個文件不能有兩個inode。不同的inode,不同的文件。另外,你可以用procfs讀取你想要的任何文件。 – 2009-02-13 16:42:53

1

並沒有真正幫助,如果懸掛的過程仍然具有打開的手柄。在掛起的進程釋放句柄之前,它不會釋放資源。但無論如何,在Windows中,可能會強制關閉一個文件,而這個文件正在使用它。來自sysinternals.com的Process Explorer將讓您查看並關閉進程已打開的句柄。

3

注意,Process Explorer中允許文件句柄的強制關閉(本地到要運行它的盒子進程)通過手柄 - >關閉句柄。

Unlocker聲稱做更多的事情,並提供其他工具有用的列表。

在重新啓動時也刪除一個選項(雖然這聽起來像不是你想要的)