2013-01-17 125 views
4

我試圖在Python中創建一個腳本來備份某些文件。但是,這些文件可以隨時重命名或刪除。我不希望我的腳本通過鎖定文件來阻止它;該文件應該能夠在備份過程中隨時刪除。Python:在不創建鎖的情況下打開文件

我該如何在Python中做到這一點?而且,會發生什麼?如果流不能被讀取,我的對象是否變爲空?

謝謝!我對Python有點新鮮。

+5

行爲取決於操作系統。你需要支持哪些操作系統? – NPE

+0

我不認爲你可以做很多事情。如果文件在讀取時被刪除,你可能會收到一些'IOError'或'OSError'(在Python中沒有'null'這樣的東西。即使文件被刪除,python管理的文件對象也不是刪除,並在下一個系統(或C)調用時會失敗,從而引發異常)。 – Bakuriu

+1

Python上的普通'open()'不會創建鎖。此外,諮詢文件系統鎖定不會阻止刪除或重命名文件,只能讀寫(甚至取決於正確使用'flock()'的應用程序)。 –

回答

5

正如kindall所述,這是Windows特有的問題。 Unix操作系統允許刪除。我需要使用win32file.CreateFile來使用特定於Windows的dwSharingMode標誌(在Python的win32文件中,它只是被稱爲「sharingmode」)。在Windows中,我需要使用win32file.CreateFile來使用Windows特定的dwSharingMode標誌。下面是一些文檔就可以了: http://docs.activestate.com/activepython/2.7/pywin32/win32file__CreateFile_meth.html

粗糙例子:

import win32file # Ensure you import the module. 

file_handle = win32file.CreateFile('filename.txt', win32file.GENERIC_READ, win32file.FILE_SHARE_DELETE | win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, None, win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None) 
+0

然後你可以使用'os.fdopen(msvcrt.open_osfhandle(file_handle,os.O_RDONLY))'把這個句柄轉換成一個標準的文件對象。另外,'os.fdopen()'也可以和'with'一起使用,就像'open()'一樣。 – user

4

在類似UNIX的操作系統(包括Linux)上,這不是問題。那麼,其他一些程序可能會在您讀取文件的同時寫入文件,這可能會導致問題(您正在複製的文件最終可能會損壞),但這可以通過驗證過程解決。

在Windows上,使用卷快照服務(又名卷影副本)。 VSS立即創建卷的快照,您可以在快照上打開文件而不鎖定原始捲上的文件。 Google很快找到了一個用於在VSS中使用VSS進行復制的Python模塊:http://sourceforge.net/projects/pyvss/

+0

接受爲答案,但我認爲除了VSS之外,我需要一些東西。 – SilentSteel

相關問題