项目空间

学习笔记N-064

应用程序设计

更新
内容块
140
阅读
约 5 分钟
路径
学习笔记 / 操作系统/编译原理 / 操作系统中的文件

DeepSeek_V4_pro

一个「标准 Windows 程序」的完整文件布局

以 Google Chrome 为例

① 桌面快捷方式

代码块Plain Text
C:\Users\你的用户名\Desktop\Google Chrome.lnk
  • •本质:一个指针

② 安装目录

代码块Plain Text
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 里的用户数据

代码块Plain Text
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

代码块Plain Text
安装目录: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: 数据全写安装目录旁边

代表:很多国产软件、游戏、绿色/便携软件

代码块Plain Text
D:\某软件\
├── 主程序.exe
├── config.ini              ← 配置直接放这
├── data\                   ← 数据也直接放这
├── logs\                   ← 日志也放这
└── save\                   ← 存档也放这

为什么不放 AppData? 原因:

  1. 1.历史惯性——老程序就是这么写的
  1. 2.偷懒——不用区分 Roaming/Local
  1. 3.方便「绿色版」——整个文件夹复制到 U 盘就能用
  1. 4.游戏特别常见——存档放安装目录方便玩家手动备份

代价:

  • •多用户共用一台电脑时互相踩踏
  • •卸载时可能删不掉 D 盘残留
  • •如果装 C 盘 Program Files,普通用户没写入权限,就崩了

类型 C:「Windows Store 应用」— 完全隔离的独立文件夹

代表:从 Microsoft Store 下载的任何应用

代码块Plain Text
C:\Program Files\WindowsApps\
    └── 某应用_版本号_哈希\     ← 权限锁死,你甚至打不开
        └── 所有文件

C:\Users\你的用户名\AppData\Local\Packages\
    └── 应用包名\
        ├── LocalState\        ← Local 数据
        ├── RoamingState\      ← Roaming 数据
        └── TempState\         ← 临时数据

UWP/Store 应用被沙盒隔离:

  • •不能随便读其他应用的文件夹
  • •卸载时 Windows 一把清掉 Packages\包名\,干净利落
  • •坏处:你没法像传统程序那样「删个配置文件来重置」


Windows 是怎么跟这些程序配合的?

Windows 提供的是 基础能力,程序自己决定用到什么程度:

代码块Plain Text
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 来说明:

代码块Plain Text
① 快捷入口
   /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 给了程序太多自由,也给了程序太多搞砸自己的机会。