windows下實現fcntl函數功能

windows下實現fcntl函數功能

fcntl函數是linux下的一個文件鎖函數,用以加密文件,給文件上鎖,防止文件同時被多個進程操作。
我遇到的主要是這兩個:

fcntl.flock(f, fcntl.LOCK_EX)
fcntl.flock(f, fcntl.LOCK_UN)

但是在windows下執行時發現並沒有這個函數,不支持,所以就去找了各種方法來代替。

安裝pywin32來實現文件所

1. 先pip安裝pywin32 :

pip install pywin32
pip list  #查看是否在已安裝列表中

安裝完成之後,需要將C:\Python27\Lib\site-packages\pywin32_system32目錄下的.dll文件複製到C:\Windows\System32目錄下,這樣便可以引用一下三個模塊了:
import win32con \\ import pywintypes \\ import win32file

2. 設計fcntl()函數代碼

複製以下代碼段,保存爲fcntlock.py文件,將其放到引用的目錄下,通過import fcntlock as fcntl 引入模塊即可,親測有效。

import os
import win32con
import pywintypes
import win32file

LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
LOCK_SH = 0  # The default value
LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
__overlapped = pywintypes.OVERLAPPED()

def lock(file, flags):
    hfile = win32file._get_osfhandle(file.fileno())
    win32file.LockFileEx(hfile, flags, 0, 0xffff0000, __overlapped)
def unlock(file):
    hfile = win32file._get_osfhandle(file.fileno())
    win32file.UnlockFileEx(hfile, 0, 0xffff0000, __overlapped)

例如:(我是放在util目錄下的)

import util.fcntlock as fcntlock
import os
with open(name, 'w') as f:
        f.write(str)
        f.flush()
        os.fsync(f)
        fcntlock.lock(f, fcntlock.LOCK_EX)
        os.rename(name, path)
        fcntlock.unlock(f)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章