You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python程序运行时如何防止关联文件(SQLite3等)被删除?

解决方案

下面是几个能实现「程序可读写关联文件,同时限制用户只读/无法删除」的实用方案,可根据场景选择:

1. 运行时锁定文件句柄(最直接有效)

核心思路:程序启动时以独占读写模式打开目标文件,保持文件句柄处于打开状态直到程序退出。Windows系统中,文件被打开且锁定时用户无法删除、修改;Linux/macOS下也会限制用户的删除操作(除非强制解除)。

代码示例:

  • 针对SQLite数据库:
import sqlite3
import tkinter as tk

# 保持数据库连接始终打开(不要提前关闭)
db_conn = sqlite3.connect("your_database.db")
cursor = db_conn.cursor()

# 程序退出时再关闭连接(绑定Tkinter窗口关闭事件)
def on_closing():
    db_conn.close()
    root.destroy()

root = tk.Tk()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()
  • 针对模板、HTML等普通文件:
import tkinter as tk

# 以读写模式打开文件,保留文件对象引用
locked_files = []
target_files = ["template.html", "config.tpl"]
for path in target_files:
    f = open(path, "r+b")
    locked_files.append(f)

# 程序运行期间可通过文件对象读写
locked_files[0].write(b"updated content")
locked_files[0].seek(0)
content = locked_files[0].read()

# 退出时关闭所有文件
def on_closing():
    for f in locked_files:
        f.close()
    root.destroy()

root = tk.Tk()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()

2. 静态资源嵌入+动态数据隔离

如果模板、HTML是无需持久化修改的静态资源,可将其打包进程序,仅让数据库文件单独存储并锁定:

  • 使用PyInstaller打包时,通过--add-data参数嵌入静态文件:
pyinstaller --onefile --add-data "template.html:." --add-data "style.tpl:." your_app.py
  • 程序运行时从打包路径读取静态文件,用户无法直接访问到这些文件,自然避免被删除;数据库文件则用方案1的方式锁定。

3. 平台特定权限配置(适合多用户环境)

Windows系统:

修改文件权限,让程序运行的用户(如管理员)拥有读写权限,普通用户仅拥有只读权限。可通过文件属性的「安全」选项卡手动配置,或用ctypes调用Windows API批量修改。注意:若程序以普通用户身份运行,此方法不适用。

Linux/macOS系统:

修改文件所有者为程序运行用户,设置权限为644(所有者读写,其他用户只读):

sudo chown your_user:your_group your_database.db template.html
sudo chmod 644 your_database.db template.html

普通用户只能读取文件,无法修改或删除;程序以所有者身份运行时可正常读写。


内容的提问来源于stack exchange,提问作者Priyanshu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:42:56