如何通过编程调用fsutil 8dot3name对应的WinAPI?
对应fsutil 8dot3name操作的WinAPI函数说明
存在直接对应的WinAPI接口,以下是对应你给出的两个fsutil命令的具体实现方式:
1. 设置卷的8.3名称生成状态(对应fsutil.exe 8dot3name set O:\ 1)
使用DeviceIoControl函数,发送FSCTL_SET_VOLUME_SHORT_NAME_CONTROL控制码,可控制指定卷是否生成8.3短名称。
调用要点:
- 先打开目标卷的句柄(使用
CreateFileW,路径格式为\\.\O:) - 构造
VOLUME_SHORT_NAME_CONTROL结构体,设置Flags为VOLUME_SHORT_NAME_CONTROL_ENABLE(对应命令中的1,启用生成)或VOLUME_SHORT_NAME_CONTROL_DISABLE(禁用) - 将结构体作为
DeviceIoControl的输入缓冲区传入
示例代码片段:
HANDLE hVolume = CreateFileW(L"\\\\.\\O:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hVolume != INVALID_HANDLE_VALUE) { VOLUME_SHORT_NAME_CONTROL control = {0}; control.Flags = VOLUME_SHORT_NAME_CONTROL_ENABLE; // 对应set命令的1 DWORD bytesReturned; DeviceIoControl(hVolume, FSCTL_SET_VOLUME_SHORT_NAME_CONTROL, &control, sizeof(control), NULL, 0, &bytesReturned, NULL); CloseHandle(hVolume); }
2. 剥离卷中的8.3短名称(对应fsutil.exe 8dot3name strip /s /f O:\)
使用DeviceIoControl函数,发送FSCTL_STRIP_SHORT_NAMES控制码,可移除指定卷(或目录)下的8.3短名称。
调用要点:
- 打开卷或目标目录的句柄(同样可使用
CreateFileW访问卷) - 构造
STRIP_SHORT_NAMES_INFORMATION结构体,设置Flags匹配命令参数:STRIP_SHORT_NAMES_FLAG_RECURSE对应/s(递归处理子目录)STRIP_SHORT_NAMES_FLAG_FORCE对应/f(强制剥离,即使文件正在被使用)
- 将结构体作为输入缓冲区传入
DeviceIoControl
示例代码片段:
HANDLE hVolume = CreateFileW(L"\\\\.\\O:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hVolume != INVALID_HANDLE_VALUE) { STRIP_SHORT_NAMES_INFORMATION stripInfo = {0}; stripInfo.Flags = STRIP_SHORT_NAMES_FLAG_RECURSE | STRIP_SHORT_NAMES_FLAG_FORCE; // 对应/s /f DWORD bytesReturned; DeviceIoControl(hVolume, FSCTL_STRIP_SHORT_NAMES, &stripInfo, sizeof(stripInfo), NULL, 0, &bytesReturned, NULL); CloseHandle(hVolume); }
注意事项:
- 这些操作需要管理员权限才能执行
- 相关结构体和控制码定义在
winioctl.h头文件中,需包含该头并链接kernel32.lib - 仅支持NTFS格式卷(FAT32默认强制支持8.3短名,无法通过此类接口修改)
内容的提问来源于stack exchange,提问作者Jabu
相关产品推荐
相关产品推荐

