簡體   English   中英

嘗試在 desktop.ini 文件上寫入時如何修復 python 中的 PermissionError?

[英]How to fix PermissionError in python when trying to write on desktop.ini file?

在使用此 python 腳本更改文件夾圖標后,我正在嘗試更改 desktop.ini 文件上的圖標資源,但我得到了這個:

發生異常:PermissionError [Errno 13] 權限被拒絕:'desktop.ini'

我試過以管理員身份運行,禁用 UAC,並更改文件的安全權限,但沒有答案。

import configparser
config = configparser.ConfigParser()
config.read('desktop.ini')
pieces = config['.ShellClassInfo']['iconresource'].split('\\')
del pieces[:-1]
config['.ShellClassInfo']['iconresource'] = pieces[0]
with open('desktop.ini','w') as configfile:
    config.write(configfile)

發生異常:PermissionError [Errno 13] 權限被拒絕:'desktop.ini'

簡短的回答

如果要向 ini 文件添加內容,請在open() function 中使用r+模式,而不是w模式。

with open(ini_path, "r+") as file:
    file.write(ini_content)

否則請在下面查找“方法 2”。

長答案

這個問題提供了一個很好的答案,為什么在嘗試對具有隱藏 (H) 或系統 (S) 屬性的文件調用 function open(some_path, 'w')時會引發權限錯誤。 您可以通過手動創建一個新的隱藏文件來進行試驗,然后使用open(hidden_file_path, 'w') ; 它會引發同樣的錯誤。

在查看隱藏文件的更一般情況時,您可以找到建議暫時刪除隱藏屬性,覆蓋文件,然后重新添加屬性的人的答案。

import os
os.system(f"attrib -h {hidden_file_path}") # remove the "hidden" attribute
with open(hidden_file_path, 'w') as file:
    file.write(new_content)                # overwrite the file
os.system(f"attrib +h {hidden_file_path}") # add back the "hidden" attribute

如果出於任何原因您不控制hidden_file_path變量的聲明,這可能是不安全的(請參閱“OS 命令注入”)。 此外,如果您嘗試使用它來覆蓋desktop.ini文件,它將無法正常工作。 使用attrib命令( os.system(f"attrib {hidden_file_path}")或直接從命令行)進一步檢查顯示,正如預期的那樣,這些文件同時具有隱藏屬性和系統屬性 (SH)。 這意味着前面的方法應該同時考慮這兩個屬性。

# method 1
import os
os.system(f"attrib -h -s {ini_path}")
with open(ini_path, 'w') as file:
    file.write(new_content)
os.system(f"attrib +h +s {ini_path}")

或者,更簡潔的選項是在調用open()時僅使用r+模式而不是w 到目前為止,在向desktop.ini文件添加內容時,它對我有用。

# method 2
with open(ini_path, "r+") as file:
    file.write(ini_content)

快速說明僅當先前內容中的字符數小於或等於新內容中的字符數時,此方法才會完全覆蓋文件。 例如,如果文件的內容是12345並且你想寫abc ,那么更新后的文件將包含abc45 而如果你寫abcdefg ,更新的文件將包含abcdefg

因此,如果您打算使用例如更短的圖標資源路徑來更新您的 ini 文件,那么使用方法 1 可能會更好。

使用 python 3.10.5 測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM