我正在尝试删除NTFS中文件的短名称。我在Windows 7上测试它。我正在以管理员身份运行我的进程。
这是我的代码:
HANDLE hFile;
DWORD error = NO_ERROR;
hFile = fh = CreateFileA(name,
GENERIC_ALL,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if(hFile == NULL || hFile == INVALID_HANDLE_VALUE)
{
error = GetLastError();
if(GetLastError() == ERROR_ACCESS_DENIED)
printf("File Access Denied.\n");
if(GetLastError() == ERROR_FILE_NOT_FOUND)
printf("File not found.\n");
return error;
}
SetLastError(NO_ERROR);
ModifyPrivilege(SE_RESTORE_NAME, TRUE);
SetLastError(NO_ERROR);
SetFileShortNameW(hFile, L""); // As per MSDN, It will work only in windows 7 and above
error = GetlastError(); // returns 1314 error
ModifyPrivilege(SE_RESTORE_NAME, FALSE);
CloseHandle(hFile);
ModifyPrivilege()的代码与MSDN上的相同:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa387705(v=vs.85).aspx
我确保我拥有SE_RESTORE_NAME权限(使用进程资源管理器)。上面的代码不会产生任何错误但是当我在十六进制编辑器中查看文件的mft记录时,短文件名仍然存在,即MFT记录有两个$ 30文件名属性,一个用于全名,另一个用于短名。
我想知道我的代码是错还是我必须做的其他事情?为什么SetFileShortNameEx函数在这种情况下没有任何影响?
答案 0 :(得分:3)
您需要在致电CreateFile
之前添加之前的权限。
您的错误处理也有点搞砸了。无需拨打SetLastError
。您只需在调用GetLastError
之前检查API调用的返回值。如果文档说它有意义,则只调用GetLastError
。对于SetFileShortName
,与许多API调用的情况一样,只有在API调用返回GetLastError
时才会调用FALSE
。所以你应该写:
if (!SetFileShortNameW(hFile, L""))
{
error = GetLastError();
// ...
}