2013-10-09 35 views

回答

6

如果你想要一個跨平臺的等價物......真的沒有一個。在POSIX系統上,其他進程總是可以刪除/重命名已經打開的文件*,除非您不想阻止它。所以,你只需要在Windows上這樣做,而且你幾乎無處不在

Python的標準文件對象不允許你直接控制Windows共享標誌。 (這是因爲他們使用跨平臺的API,比如stdio的fopen而不是Windows特定的API。)

如果你想這樣做,你必須調用不同的文件函數。

在IronPython中,您當然可以調用您在C#中調用的完全相同的.NET函數。

在CPython中,您不能使用.NET,因爲CPython是本機Win32應用程序。這意味着您必須致電CreateFile。你可以使用pywin32包來使這更容易,但它仍然有點痛苦。

而不是僅僅f = open(path, 'r+'),你需要像這樣(未經):

f = win32file.CreateFile(path, 
         win32con.GENERIC_READ | win32con.GENERIC_WRITE, 
         win32con.FILE_SHARE_DELETE, 
         None, 
         0, 
         win32con.OPEN_ALWAYS, 
         None) 

然後,而不是buf = f.read(4096),你這樣做:

buflen, buf = win32file.ReadFile(f, 4096, None) 

,取而代之的只是堅持它一個with聲明,你必須明確地關閉它,與:

win32file.CloseFile(f) 

如果你打算做很多這樣的事情,在類文件對象中包含win32file句柄並不難,而且可能值得做。

最棘手的一點是決定你想要堅持多麼接近open的參數,並編寫代碼將你得到的值轉換成想要的值。 (也有一些邊界情況Win32本地文件處理比Win32的標準輸入輸出文件不同,但通常這些不會有點你。)

您可能也想看看io模塊,讓你只需要實現幫手一些原始的開放/讀取/寫入/關閉功能,並自動將其包裝在一個完整的文件類對象中。


*事實上,所有他們能做的就是取消鏈接目錄條目你打開。即使這是連接到該文件的唯一目錄條目,該文件本身仍然存在,直到其最後一個打開的句柄關閉。

+0

*這是因爲他們使用跨平臺的API,如stdio的fopen而不是Windows特定的API *有機會它將被修復 - 請參閱[使用本機Windows API添加新的io.FileIO](http:// bugs.python.org/issue12939)。順便說一下,在這種情況下,使用跨平臺API阻止跨平臺是很有趣的;) –

+0

@PiotrDobrogost:它可以像微軟關心的那樣完全像跨平臺一樣;如果你想超越自己的想法,它會妨礙你的發展......順便說一句,在3.x中,Python使用POSIX/MSVCRT API,比如「open」而不是stdio API。從理論上講,應該更容易改變使用Win32 API,但這將是一個非常大的改變;除非你可以在任何地方用HANDLEs來代替fd,並且爲MSDCRT在fd之上模擬的所有東西編寫新的代碼,否則它不能成爲替代品,只是一種單獨的文件類型。但是我有點驚訝沒有人的PyPI的那種單獨的類型... – abarnert

相關問題