学习笔记N-064
应用程序设计
- 更新
- 内容块
- 140
- 阅读
- 约 5 分钟
- 路径
- 学习笔记 / 操作系统/编译原理 / 操作系统中的文件
DeepSeek_V4_pro
一个「标准 Windows 程序」的完整文件布局
以 Google Chrome 为例
① 桌面快捷方式
C:\Users\你的用户名\Desktop\Google Chrome.lnk- •本质:一个指针
② 安装目录
C:\Program Files\Google\Chrome\Application\
├── chrome.exe ← 主程序
├── chrome.dll ← 核心逻辑(巨大,几百MB)
├── chrome_proxy.exe ← 代理辅助进程
├── icudtl.dat ← 国际化数据
└── 版本号文件夹/ ← 各版本(Chrome 保留旧版本用于回滚)- •安装在
Program Files,普通用户没有写入权限
- •所有登录这台电脑的用户都用同一份 chrome.exe
- •更新时由 Chrome 的 Update 服务(以 SYSTEM 权限)来替换
③ AppData 里的用户数据
C:\Users\你的用户名\AppData\
│
├── Local\Google\Chrome\User Data\
│ ├── Default\
│ │ ├── Cache\ ← 网页缓存(图片、CSS、JS)
│ │ ├── Code Cache\ ← V8 编译后的 JS 缓存
│ │ ├── GPUCache\ ← 显卡渲染缓存
│ │ └── Service Worker\ ← 离线缓存
│ ├── Crashpad\ ← 崩溃报告(不漫游,很合理)
│ └── ShaderCache\ ← GPU 着色器缓存
│
├── Roaming\ ← Chrome 不用 Roaming,配了 policy 不让漫游
│ (理论上可以放书签、密码,但 Chrome 用 Google 账号同步替代了)
│
└── LocalLow\ ← Chrome 也不用这个三种典型程序的不同策略
不是所有程序都像我上一轮说的三层齐全。实际情况分几种:
类型 A: 严格三层分离
代表:Visual Studio Code
安装目录:C:\Program Files\Microsoft VS Code\
└── Code.exe, bin/, resources/ ← 源文件,不动
Roaming:%APPDATA%\Code\
├── User\
│ ├── settings.json ← 你的编辑器设置
│ ├── keybindings.json ← 自定义快捷键
│ └── snippets/ ← 代码片段
└── extensions/ ← 插件(也放 Roaming!)
Local:%LOCALAPPDATA%\Code\
└── Cache\ ← 纯缓存VS Code 把插件放在 Roaming 很有意思——意味着你换台电脑登录,插件配置也跟着走。但问题是大插件几百 MB,域漫游会很痛苦。所以新版本提供了 Portable 模式可切换。
类型 B: 数据全写安装目录旁边
代表:很多国产软件、游戏、绿色/便携软件
D:\某软件\
├── 主程序.exe
├── config.ini ← 配置直接放这
├── data\ ← 数据也直接放这
├── logs\ ← 日志也放这
└── save\ ← 存档也放这为什么不放 AppData? 原因:
- 1.历史惯性——老程序就是这么写的
- 2.偷懒——不用区分 Roaming/Local
- 3.方便「绿色版」——整个文件夹复制到 U 盘就能用
- 4.游戏特别常见——存档放安装目录方便玩家手动备份
代价:
- •多用户共用一台电脑时互相踩踏
- •卸载时可能删不掉 D 盘残留
- •如果装 C 盘 Program Files,普通用户没写入权限,就崩了
类型 C:「Windows Store 应用」— 完全隔离的独立文件夹
代表:从 Microsoft Store 下载的任何应用
C:\Program Files\WindowsApps\
└── 某应用_版本号_哈希\ ← 权限锁死,你甚至打不开
└── 所有文件
C:\Users\你的用户名\AppData\Local\Packages\
└── 应用包名\
├── LocalState\ ← Local 数据
├── RoamingState\ ← Roaming 数据
└── TempState\ ← 临时数据UWP/Store 应用被沙盒隔离:
- •不能随便读其他应用的文件夹
- •卸载时 Windows 一把清掉
Packages\包名\,干净利落
- •坏处:你没法像传统程序那样「删个配置文件来重置」
Windows 是怎么跟这些程序配合的?
Windows 提供的是 基础能力,程序自己决定用到什么程度:
Windows 提供的基础设施:
│
├── 快捷方式 (.lnk)
│ → Shell 解析,启动目标程序
│ 程序可以完全不创建快捷方式(比如只放开始菜单)
│
├── 环境变量
│ %APPDATA% → C:\Users\xxx\AppData\Roaming
│ %LOCALAPPDATA%→ C:\Users\xxx\AppData\Local
│ %TEMP% → C:\Users\xxx\AppData\Local\Temp
│ %PROGRAMDATA% → C:\ProgramData(所有用户共享的数据)
│ 程序调用这些变量来找到对应目录
│
├── 文件权限(NTFS ACL)
│ Program Files → 普通用户只读
│ AppData → 当前用户完全控制
│ 别用户文件夹 → 你根本没权限看
│ 这才保证了「程序共享,数据隔离」
│
├── 注册表
│ HKCU\Software\某软件\ → 当前用户的配置
│ HKLM\Software\某软件\ → 所有用户的配置(需要管理员权限写)
│ 很多程序用注册表替代/补充配置文件
│
└── 安装/卸载机制
MSI 安装包 → Windows Installer 服务管理
安装时写入:文件放哪、注册表写哪、创建哪些快捷方式
卸载时按清单反操作
但 D 盘的残留文件 Windows 管不了(只能清理注册表)关键点:Windows 只提供环境和约定,强制力很弱。 一个程序完全可以:
- •不创建快捷方式
- •不往 AppData 写数据
- •在 D 盘随地拉屎
- •注册表里写一堆垃圾
Windows 不会阻止它——这是兼容性的代价。macOS 在这方面严格得多。
macOS 对应的完整例子
同样用 Chrome on macOS 来说明:
① 快捷入口
/Applications/Google Chrome.app ← 实际上是文件夹(Bundle)
或者 Dock 上的图标 ← 就是别名
② Bundled 程序本身(右键 → 显示包内容)
/Applications/Google Chrome.app/Contents/
├── MacOS/
│ └── Google Chrome ← 真正的可执行文件
├── Resources/ ← 图标、本地化字符串等
└── Frameworks/ ← Chrome 自己打包的依赖库
③ 用户数据
~/Library/Application Support/Google/Chrome/
├── Default/
│ ├── Bookmarks ← 书签
│ ├── History ← 浏览历史
│ ├── Preferences ← 设置
│ └── Extensions/ ← 扩展
├── Safe Browsing/ ← 安全数据
└── Crashpad/ ← 崩溃报告
④ 缓存
~/Library/Caches/Google/Chrome/
└── Default/
└── Cache/ ← 网页缓存
⑤ 偏好(.plist 文件)
~/Library/Preferences/com.google.Chrome.plist
→ 这是 macOS 特有的,用 XML 格式存简单键值对macOS 和 Windows 的核心差异
维度 | Windows | macOS |
程序安装 | 运行安装程序,文件散落各处 | 拖 .app 到 Applications,一个 Bundle 全包 |
Bundle 概念 | 没有 | .app 是一个文件夹伪装成文件 |
配置存储 | AppData + 注册表 | ~/Library(纯文件) |
卸载 | 控制面板/设置里卸载 | 拖到废纸篓就行(但 Library 里残留要手动清) |
强制执行 | 弱(兼容性优先) | 强(沙盒/权限/签名强制) |
多用户隔离 | 靠 AppData 路径 | 靠 ~/Library 路径 |
跨用户共享程序 | Program Files 自然支持 | /Applications 自然支持 |
最大的设计理念差异:
- •Windows 靠路径约定 + 安装脚本来组织,不强制
- •macOS 靠 Bundle 自包含 + 沙盒来组织,尽量不让你操心安装后的事情
这也解释了为什么 Windows 下「安装后再也打不开」的问题比 macOS 多——Windows 给了程序太多自由,也给了程序太多搞砸自己的机会。