Я пытаюсь воспроизвести нечто подобное, как в On Windows, how to open for writing a file already opened for writing by another process? поэтому я последовал ответ, Петр Dobrogost, модифицирующий код из Using a struct as a function argument with the python ctypes module, меняя флаги и атрибуты моих целей (взято отсюда https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx и здесь http://unix.superglobalmegacorp.com/Net2/newsrc/sys/fcntl.h.html) и добавление Python (с использованием 3,3 версии) open
функция: от пути ОС импорта из 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')
я получаю
OSError: [Errno 9] Bad file descriptor
Это может быть что-то очень простое, так как я новичок в python ... Я был бы очень признателен, если бы кто-нибудь мог помочь мне исправить это.
Самая большая ошибка здесь в вызове '_open_osfhandle' в msvcrt.dll - закрытой C-среде Windows-системных DLL-файлов (много злоупотреблений MinGW). Этот CRT не имеет ничего общего с CPython. Вы должны использовать модуль 'msvcrt' Python для назначения дескриптора файла. – eryksun
@eryksun Спасибо! Я использовал 'msvcrt.open_osfhandle (hFile.value, O_RDONLY)' (мне пришлось использовать '.value' для получения типа' int', потому что в противном случае я получал TypeError), и теперь он работает. – Remolek