Windows预读文件(.pf)是系统为加速程序启动生成的二进制记录,保存在系统目录的Prefetch文件夹中,其中记录了某个程序历次启动时所加载的文件与目录信息。通过C#程序直接解析这些文件,可以在不依赖外部工具的情况下分析程序启动时的文件加载行为。

什么是Windows预读文件
当Windows上的程序第一次运行时,系统会创建对应的.pf文件,文件名通常由程序主模块名、哈希值以及.pf后缀组成。该文件记录了程序运行次数、最近执行时间以及启动过程中访问过的文件列表。通过分析这些内容,可以了解程序依赖了哪些动态库、配置或数据文件。
pf文件的基本结构
不同Windows版本的pf格式略有差异,但开头通常包含固定的签名和版本信息。以常见的版本23(Windows 10)为例,文件头部包含如下关键字段:
- 签名:固定为字符"SCCA"
- 格式版本:如17、23、30等
- 程序名长度与偏移
- 文件加载记录区与目录记录区
C#读取pf文件的示例
下面示例使用C#的BinaryReader读取pf文件头部,并输出签名与版本,再从文件信息段提取程序名称。实际分析中还需根据偏移解析Unicode字符串与文件记录数组。
using System;
using System.IO;
using System.Text;
class PrefetchReader
{
static void Main(string[] args)
{
// pf文件路径,需具备读取权限
string path = @"C:WindowsPrefetchNOTEPAD.EXE-AB3C1234.pf";
if (!File.Exists(path))
{
Console.WriteLine("文件不存在");
return;
}
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
using (BinaryReader br = new BinaryReader(fs))
{
// 读取4字节签名
byte[] sigBytes = br.ReadBytes(4);
string signature = Encoding.ASCII.GetString(sigBytes);
Console.WriteLine("签名: " + signature);
// 读取4字节版本
int version = br.ReadInt32();
Console.WriteLine("版本: " + version);
// 跳过部分头部字段
br.BaseStream.Seek(0x10, SeekOrigin.Begin);
int nameLen = br.ReadInt32();
int nameOffset = br.ReadInt32();
// 定位程序名并读取
br.BaseStream.Seek(nameOffset, SeekOrigin.Begin);
byte[] nameBytes = br.ReadBytes(nameLen * 2);
string programName = Encoding.Unicode.GetString(nameBytes).TrimEnd(' ');
Console.WriteLine("程序名: " + programName);
}
}
}
分析文件加载行为
在pf文件中,文件加载记录一般位于头部之后的特定偏移处,每条记录包含文件路径的哈希或偏移索引,配合字符串段可还原完整路径。用C#可循环读取记录数量字段,再逐条解析路径,从而得到程序启动时加载的全部文件清单。
注意事项
- 读取Prefetch目录需要管理员权限,否则会抛出UnauthorizedAccessException
- 不同Windows版本的pf结构字段偏移不同,解析前应先判断版本号
- 不要随意删除或写入.pf文件,可能影响系统性能或导致解析异常
小结
通过C#直接操作与解析Windows预读文件,可以有效分析程序启动时的文件加载行为。掌握pf格式头部与记录区布局后,便能自行编写轻量工具完成软件依赖审查、启动诊断等任务。
C#Windows_prefetchfile_load_analysis修改时间:2026-07-29 19:09:24