我想讀取/寫入文件,但允許它被其他進程刪除/重命名。在C#
中,您可以用FileShare.Delete
打開該文件,Python是否具有相同的功能?Python IO允許打開的文件在Windows上被刪除/重命名嗎?
2
A
回答
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
模塊,讓你只需要實現幫手一些原始的開放/讀取/寫入/關閉功能,並自動將其包裝在一個完整的文件類對象中。
*事實上,所有他們能做的就是取消鏈接的目錄條目你打開。即使這是連接到該文件的唯一目錄條目,該文件本身仍然存在,直到其最後一個打開的句柄關閉。
相關問題
- 1. 重命名後無法刪除文件(文件打開)
- 2. Jackrabbit允許刪除文件嗎?
- 3. 使用打開的句柄刪除或重命名文件
- 4. 以編程方式重命名Windows上的打開文件
- 5. 文件重命名/刪除
- 6. 如何刪除和重命名Windows上的C文件
- 7. filelock允許打開文件
- 8. 重命名刪除權限被阻止的文件夾/文件
- 9. Python重命名ftp上傳文件刪除
- 10. 檢查打開的文件是否在python中打開後被刪除
- 11. 如何在文件上創建鎖而不允許WINDOWS打開文件?
- 12. 允許重命名AppComponent?
- 13. MuleStudio文件在簡單重命名時被刪除
- 14. SVN不會允許我重命名或創建一個刪除文件夾名稱的文件夾
- 15. htaccess的刪除文件擴展名,並允許同名
- 16. Python IO:在打開期間向文件名添加字符()
- 17. python文件被重命名,如何獲得'重命名時間'
- 18. 使用斷開鏈接刪除和重命名文件()和重命名()
- 19. 文件沒有被刪除和重命名在Windows上,但正在Mac上工作
- 20. Python打開文件並刪除一行
- 21. github上的文件在開發機器上被刪除時不會被刪除?
- 22. 重命名自己打開文件
- 23. 在Windows中刪除打開的文件(創建一個匿名文件)?
- 24. Python:哪個命令增加Windows上打開文件的數量?
- 25. 文件刪除和重命名問題
- 26. 文件未重命名或刪除
- 27. 文件重命名和刪除錯誤
- 28. 刪除和重命名文件
- 29. 重命名和刪除文件
- 30. 你能打開stdin作爲MS Windows上的Python文件嗎?
*這是因爲他們使用跨平臺的API,如stdio的fopen而不是Windows特定的API *有機會它將被修復 - 請參閱[使用本機Windows API添加新的io.FileIO](http:// bugs.python.org/issue12939)。順便說一下,在這種情況下,使用跨平臺API阻止跨平臺是很有趣的;) –
@PiotrDobrogost:它可以像微軟關心的那樣完全像跨平臺一樣;如果你想超越自己的想法,它會妨礙你的發展......順便說一句,在3.x中,Python使用POSIX/MSVCRT API,比如「open」而不是stdio API。從理論上講,應該更容易改變使用Win32 API,但這將是一個非常大的改變;除非你可以在任何地方用HANDLEs來代替fd,並且爲MSDCRT在fd之上模擬的所有東西編寫新的代碼,否則它不能成爲替代品,只是一種單獨的文件類型。但是我有點驚訝沒有人的PyPI的那種單獨的類型... – abarnert