題 在使用文件時將文件從一個位置移動到另一個位置


今天我嘗試將Microsoft Word文檔文件在Microsoft Word中打開時從一個地方移動到另一個地方。但隨後它說它無法移動,因為它在Microsoft Word中打開。同樣的事情發生在我們嘗試在媒體播放器中播放時移動MP3文件時。我認為還有很多這樣的案例。

但是為什麼在任何程序中打開文件時都無法移動文件?它背後的基本理念是什麼?


4
2017-12-05 04:29


起源


如果您嘗試“複製並粘貼”,它只需粘貼而不會出現任何錯誤。但如果你正在嘗試“剪切和粘貼”,它就不會。所以重新檢查你的問題。 - Damon
@AaKASH這是什麼操作系統?文件是本地還是遠程?你能顯示實際的錯誤信息嗎?哦是的,這不是一個正確的舉動,而是一個副本? - Louis
@Louis這是Microsoft Windows。 - Ufomammut


答案:


你問的概念叫做 並發 和 同步 控制,並指一套 防止同時發生的技術 (並且可能存在衝突)對多個進程可訪問的數據的更改。

教科書的概念例子 是一對已婚夫婦,共有一張借記卡,賬戶中有1000美元。如果他們在城鎮對面的自動取款機上,並且兩者都在同一時刻撤回1000美元,並且沒有並發控制,那麼該銀行將總共支付2000美元,這顯然是不對的。它甚至可能兩台ATM都會將數量減少到0,而不是每減去1000,所以銀行可能甚至沒有註意到它們被扯掉了。

進一步來說, 並發 指的是同時發生多個事情的情況(以及可能發生的問題),同步是一組避免並發問題的技術,通常是通過控制誰可以在任何給定時間使用鎖來更改數據。

要產生並發問題,您需要幾個組件:

  1. 系統必須實現多個進程或線程(通常支持多個用戶,但這不是一個嚴格的要求。)
  2. 進程/線程/用戶必須能夠訪問他們可以更改的共享數據位。

在這種情況下,文件是數據,兩個進程是副本和編輯器/播放器 正在訪問該文件。

文件系統將文件並發作為任何現代操作系統的基本特徵。 MS文件系統API(.dll)通過創建同步來處理此方案 鎖定文件 當進程打開它們時。當一個或另一個進程正在更改數據時,鎖會阻止文件上的其他操作。對於普通內容文件,當第一個進程打開文件進行讀/寫時,它會建立一個寫鎖定,阻止所有其他進程更改文件。此外,當主動寫入該文件時,會建立一個讀鎖定,這樣如果另一個進程嘗試讀取數據,它將不會在更改之前從其中獲取部分數據,而從之後獲取部分數據。這些讀鎖幾乎在寫入文件後立即釋放,但寫鎖仍然存在,直到文件關閉。當進程讀取數據時,也會建立讀鎖定,以防止在讀取過程中更改文件。一般的想法是,當存在讀鎖時你不能寫,並且在任何給定的時間最多只能存在一個寫鎖,所以只有在沒有鎖或者只有一個寫鎖的情況下才能寫一個文件。寫作。

通常使用MS調用的內容文件來訪問“單寫多讀語義“,這通常會允許複製相關文件,因為複製過程不需要寫鎖定。我不確定為什麼你的MP3播放器會鎖定mp3,但我的預感是它與它有關元數據編輯器內置於播放器中。無論哪種方式,重要的是要注意到 進程本身可以控制建立什麼鎖並且沒有好的方法來告訴程序員在想什麼。

一些MS Office文檔更加複雜化問題,因為它們 創建臨時文件 用於編輯(主要是字和功率點),這可能允許多個編輯者同時更改自己的副本,並使用特殊技術來阻止User2保存文檔,並覆蓋User2打開文件後保存的User1更改。然而,Excel和Access可能會 阻止對User2的寫訪問,並彈出一個窗口,詢問您是否希望在User1退出文件時收到通知,或者允許該文件以User2的只讀模式打開。 MS Office版本以不同方式處理這些問題。例如,辦公室'07,我必須在將文件附加到電子郵件之前關閉文件。在2010/2013年,我沒有。它還可以在本地或通過網絡共享訪問文檔。

這是一個非常複雜的主題集,它以無數種方式對多進程/多用戶系統產生巨大影響,因此針對每種情況使用的策略都是無數的。我在這篇文章中甚至都沒有表面。在處理多線程IO算法和數據庫並發控制時,它變得非常有趣。這裡的鏈接應該為您提供一個良好的起點,探索概念,以適合您的需求和curisoity。

祝好運


18
2017-12-05 05:44



在Windows中,只要存在活動文件句柄,就會禁止移動,無論它是否為只讀。許多程序(如文本編輯器)將打開文件句柄,讀取文件,然後關閉。保存時,它將打開文件,寫入數據,然後關閉。但是,其他程序(如mp3播放器)將保持文件句柄處於打開狀態。 mp3播放器會這樣做,因為它一次只讀取一些數據,而不是一次讀取所有數​​據。這就是為什麼我的一些千兆字節FLAC不會崩潰我的4GB PC。 - Thebluefish
啊,我看到操作已經更新了他們的帖子,表明他們試圖移動文件,而不是按照最初的說明復制它。是的,你是完全正確的,你不能在文件打開時移動文件,無論任何類型的鎖定;句柄足以阻止操作。 - Frank Thomas


弗蘭克的答案非常完整但很長。這是一個簡單的原因。您無法移動該文件,因為該程序(Office或MP3播放器)正在使用它。移動文件會復制它,然後刪除原始文件。不允許刪除正在使用的文件。

Unix系統似乎允許您刪除正在使用的文件。訣竅是文件是 實際上沒有刪除 直到所有程序都停止使用它。該文件不可見但仍在磁盤上。但Windows只是說“不!”


0
2017-12-05 20:41