2016-12-06 7 views
0

On Windows, how to open for writing a file already opened for writing by another process? に私は(ここhttps://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspxと、ここhttp://unix.superglobalmegacorp.com/Net2/newsrc/sys/fcntl.h.htmlから取られた)私の目的にフラグや属性の変更、Using a struct as a function argument with the python ctypes moduleからコードをmodyfing、ピョートルDobrogostによって答えが続くとPythonを追加すると私は同じようなことを再現しようとしています(使用して3.3バージョン)open機能: OSのインポートパス からのctypesからは*インポートctypes.wintypesから* Pythonでは、ctypesファイル記述子を渡してファイルを開く方法は?

GENERIC_READ = 0x80000000 
GENERIC_WRITE = 0x40000000 

FILE_SHARE_DELETE = 0x00000004 
FILE_SHARE_READ = 0x00000001 
FILE_SHARE_WRITE = 0x00000002 
FILE_SHARE_READ_WRITE = (FILE_SHARE_READ | FILE_SHARE_WRITE) 

OPEN_EXISTING = 3 

FILE_ATTRIBUTE_NORMAL = 128 
FILE_ATTRIBUTE_TEMPORARY = 256 

O_RDONLY = 0x0000  # open for reading only 
O_WRONLY = 0x0001  # open for writing only 
O_RDWR = 0x0002  # open for reading and writing 
O_ACCMODE = 0x0003  # mask for above modes 
O_APPEND = 0x0008  # set append mode 

INVALID_HANDLE_VALUE = -1 
LPOVERLAPPED = c_void_p 
LPSECURITY_ATTRIBUTES = c_void_p 

NULL = 0 
FALSE = BOOL(0) 
TRUE = BOOL(1) 

def CreateFile(filename, access, sharemode, creation, flags): 
    return HANDLE(windll.kernel32.CreateFileW(
     LPWSTR(filename), 
     DWORD(access), 
     DWORD(sharemode), 
     LPSECURITY_ATTRIBUTES(NULL), 
     DWORD(creation), 
     DWORD(flags), 
     HANDLE(NULL) 
    )) 


def translate_path(fpath): 
    fpath = path.abspath(fpath) 
    if fpath[len(fpath)-1] == '\\' and fpath[len(fpath)-2] == ':': 
     fpath = fpath[:len(fpath)-1] 
    return '\\??\\%s' % fpath 

link_name = 'G:\\MATLAB\\Chronos_Python\\test.txt' 
link_name = path.abspath(link_name) 

hFile = CreateFile(link_name, GENERIC_READ, FILE_SHARE_WRITE, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL) 

if hFile == HANDLE(INVALID_HANDLE_VALUE): 
    raise Exception('Failed to open directory for junction creation.') 

cFile = ctypes.cdll.msvcrt._open_osfhandle(hFile,O_RDONLY) 
pyFile = open(cFile,'r') 
pyFile.read() 
pyFile.close() 
ctypes.cdll.msvcrt._close(cFile) 

windll.kernel32.CloseHandle(hFile) 

インポートが、ラインpyFile = open(cFile,'r')で私は

を取得します3210

OSError: [Errno 9] Bad file descriptor

私はPythonの初心者ですから、非常に基本的なものかもしれません... 誰かが私にそれを解決するのを助けることができたら大変感謝します。ファイルへのハンドルを仮定し

+0

ここで最大の間違いは、msvcrt.dllの '_open_osfhandle'関数を呼び出すことです。これは、WindowsシステムDLLのプライベートなCランタイムです(MinGWが大いに濫用しています)。このCRTはCPythonとは関係ありません。 Pythonの 'msvcrt'モジュールを使用してファイル記述子を割り当てる必要があります。 – eryksun

+0

@eryksunありがとう!私は 'msvcrt.open_osfhandle(hFile.value、O_RDONLY)'を使用しました(そうでなければ、私はTypeErrorを取得していたので、 'int型を取得するために' .value'を使用しなければなりませんでした)。 – Remolek

答えて

0

が適切に生成された、私はあなたの問題はここにあるかもしれないと思う:

pyFile = open(cFile,'r') 

あなたがCランタイムファイルディスクリプタをオープンしようとしているので、あなたが使用する必要がありますPythonでのfdopen機能:

pyFile = os.fdopen(cFile, 'r') 

あなたがここにドキュメントを見たいと思うかもしれません - PythonはWindows上で標準ライブラリをMSVCRTの機能の一部を公開します。 https://docs.python.org/3.6/library/msvcrt.html#msvcrt.open_osfhandle

関連する問題