【发布时间】:2020-03-26 07:38:39
【问题描述】:
我有一个可以成功将二进制数据写入文件的 Python 脚本:
iterable_array = [i + 32 for i in range(50)]
file_handle = open("a.bin", "wb")
bytes_to_write = bytearray(iterable_array)
file_handle.write(bytes_to_write)
file_handle.close()
但是,我收到以下错误:
Traceback (most recent call last):
File "python_100_chars.py", line 20, in <module>
file_handle = open("a.bin", "wb")
OSError: [Errno 22] Invalid argument: 'a.bin'
当我在执行以下程序(最初来自 Microsoft 文档)时尝试编写,该程序创建文件映射并在按键后读取数据:
HANDLE hFile = CreateFileA( "a.bin",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
hFile, // use paging file
NULL, // default security
PAGE_EXECUTE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
_getch();
printf("string inside file:%s",(char *)((void *)pBuf));
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
我已经测试过,我可以通过以下方式使用基本 I/O 写入内存映射文件(并查看结果):
HANDLE hFile = CreateFileA( "a.bin",
GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL ,
NULL);
char *p = "bonjour";
DWORD bw;
WriteFile( hFile,
p,
8,
&bw,
NULL);
- python 脚本在做什么阻止它写入?
感谢您的任何反馈!
【问题讨论】:
-
请注意,
wb会截断文件。也许你想做r+b! -
我不确定 Python 在做什么,但我相信
w可以转换为CREATE_ALWAYS -
更改为
r+b已修复,谢谢!是的,它可能正在设置 CREATE_ALWAYS。我会尝试在编写的C程序中设置它,看看它是否会抛出任何错误。 -
好的,正如人们所期望的那样:ERROR_USER_MAPPED_FILE (1224) 请求的操作无法在打开了用户映射部分的文件上执行。如果你把它变成一个答案,我会接受它顺便说一句:)
-
已答复。我还添加了一个 POSIX 示例和解释,说明 python 程序可以在 Linux、OS X 等中正确运行。
标签: python c windows io shared-memory