I've studied the problem with Process Monitor. If a file is hidden,
open(f, "w") fails, whereas os.open(f, os.W_OK|os.O_CREAT) succeeds.
In the succeeding call, process monitor reports
Desired Access: Generic Read/Write
Disposition: OpenIf
Options: Synchronous IO Non-Alert, Non-Directory File
Attributes: N
ShareMode: Read, Write
AllocationSize: 0
OpenResult: Opened
In the failing call, it reports
Desired Access: Generic Write, Read Attributes
Disposition: OverwriteIf
Options: Synchronous IO Non-Alert, Non-Directory File
Attributes: N
ShareMode: Read, Write
AllocationSize: 0
I then tried os.open(f, os.W_OK|os.CREAT|os.O_TRUNC) which also fails,
giving
Desired Access: Generic Read/Write
Disposition: OverwriteIf
Options: Synchronous IO Non-Alert, Non-Directory File
Attributes: N
ShareMode: Read, Write
AllocationSize: 0
So it fails for FILE_OVERWRITE_IF, but succeeds for FILE_OPEN_IF. These
map back to CREATE_ALWAYS and OPEN_ALWAYS - apparently, you can't
truncate a hidden file on Vista.