当前位置: 首页 > 面试题库 >

IOError:[Errno 13]尝试以“ w”模式打开隐藏文件时,权限被拒绝

勾岳
2023-03-14
问题内容

我想替换隐藏文件的内容,因此我尝试以w模式打开它,以便将其删除/截断:

>>> import os
>>> ini_path = '.picasa.ini'
>>> os.path.exists(ini_path)
True
>>> os.access(ini_path, os.W_OK)
True
>>> ini_handle = open(ini_path, 'w')

但这导致了回溯:

IOError: [Errno 13] Permission denied: '.picasa.ini'

但是,我可以通过r+模式实现预期的结果:

>>> ini_handle = open(ini_path, 'r+')
>>> ini_handle.truncate()
>>> ini_handle.write(ini_new)
>>> ini_handle.close()

问:wr+模式之间有什么区别,一个模式具有“拒绝权限”但另一个模式运行良好?

更新: 我在使用Python 2.6.6的Win7
x64上,并且目标文件具有其隐藏的属性集。当我尝试关闭hidden属性时,w模式成功。但是当我重新打开它时,它再次失败。

问: 为什么w模式在隐藏文件上失败?这是已知的行为吗?


问题答案:

这就是Win32
API的工作方式。在后台,Python的open函数正在调用该CreateFile函数,如果失败,它将Windows错误代码转换为Python
IOError

r+开放的模式对应于dwAccessModeGENERIC_READ|GENERIC_WRITEdwCreationDispositionOPEN_EXISTING。在w开放的模式对应于dwAccessModeGENERIC_WRITEdwCreationDispositionCREATE_ALWAYS

如果您仔细阅读了CreateFile文档中的说明,则表示:

如果指定了CREATE_ALWAYSFILE_ATTRIBUTE_NORMAL,则CreateFile失败,并将最后一个错误设置ERROR_ACCESS_DENIED为文件是否存在并具有FILE_ATTRIBUTE_HIDDENorFILE_ATTRIBUTE_SYSTEM属性。为避免该错误,请指定与现有文件相同的属性。

因此,如果您CreateFile直接从C代码调用,解决方案将是添加FILE_ATTRIBUTE_HIDDENdwFlagsAndAttributes参数中(而不是FILE_ATTRIBUTE_NORMAL)。但是,由于Python
API中没有选项告诉它传递该标志,因此您只需要使用其他打开模式或使文件不隐藏来解决该问题。



 类似资料:
  • 问题内容: 我明白了,不知道这段代码有什么问题。 我正在尝试读取具有绝对路径(仅表示)的文件, 和相对路径(意思是),我希望程序将文件写入给定的任何路径-如果是绝对路径,则应将其写入当前目录;否则,转到给定的路径。 编码: 给出的错误: 我执行代码的方式: 我在这里做错了什么? 问题答案: 您似乎正在尝试使用以下代码替换扩展名: 但是,您似乎混合了数组索引。请尝试以下操作: 请注意在第二行代码中使

  • 问题内容: 我编写的python程序存在一个小问题,该程序可以从特殊文本文件中提取一些信息。循环(下面的代码)需要执行我的函数,超过500个文件(一个文件列出一个列表),这样我才能构建数据集。 错误:发生的是IOException ,因此由于某种原因python无法访问文件。我已经检查了目录路径名(位置)和文件许可权,它们是正确的(读+写)。有什么想法为什么当文件确实存在且路径名正确时会报告IOE

  • 我有一个问题与PHP脚本在我的网络服务器(Apache/2.4.10在Raspbian),我不能生成一个新的文件。我试过chmod 777(这是非常糟糕的做法),但它仍然不起作用。我已经为此挣扎了几天,即使经过广泛的研究,我也找不到解决这个问题的方法。下面是我的代码和它产生的错误消息: 警告:fopen(newfile.txt):无法打开流:第4行 /var/www/html/handlers/w

  • 这似乎很奇怪,因为该命令试图在Program Files中更改文件,而不是在C:\users\username中更改它应该在的位置。此外,当我为一个.gitconfig文件检查C:\users\username时,我找不到一个。有人知道这是怎么回事吗?

  • 更新 结果发现我调用open和close FileOutputStream的频率太高了,这会在某个时候抛出FileNotFoundException。听起来更像是线程问题。

  • 有趣的是,当我尝试它下载的sudo版本时,但是终端中不能识别。 我的节点是10.16。我的净现值是6.9。0 这是文件问题还是我的Mac?