<p>这就是Win32 API的工作原理。在引擎盖下,Python的<code>open</code>函数正在调用<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx">^{<cd2>}</a>函数,如果失败,它会将Windows错误代码转换为Python <code>IOError</code>。</p>
<p>打开模式对应于<code>GENERIC_READ|GENERIC_WRITE</code>的<code>dwAccessMode</code>和<code>OPEN_EXISTING</code>的<code>dwCreationDisposition</code>。<code>w</code>打开模式对应于<code>GENERIC_WRITE</code>的<code>dwAccessMode</code>和<code>CREATE_ALWAYS</code>的<code>dwCreationDisposition</code>。</p>
<p>如果您仔细阅读<code>CreateFile</code>文档中的注释,它会说:</p>
<blockquote>
<p>If <code>CREATE_ALWAYS</code> and <code>FILE_ATTRIBUTE_NORMAL</code> are specified, <code>CreateFile</code> fails and sets the last error to <code>ERROR_ACCESS_DENIED</code> if the file exists and has the <code>FILE_ATTRIBUTE_HIDDEN</code> or <code>FILE_ATTRIBUTE_SYSTEM</code> attribute. To avoid the error, specify the same attributes as the existing file.</p>
</blockquote>
<p>因此,如果直接从C代码调用<code>CreateFile</code>,解决方案是将<code>FILE_ATTRIBUTE_HIDDEN</code>添加到<code>dwFlagsAndAttributes</code>参数(而不是仅仅<code>FILE_ATTRIBUTE_NORMAL</code>)。但是,由于Python API中没有告诉它传入该标志的选项,您只需使用不同的打开模式或使文件不隐藏来解决它。</p>