Windows C编程中的文件属性常量

时间:2017-09-21 09:33:36

标签: windows file winapi attributes hidden

我有一个名为myhj.txt的文件,我从cmd attrib +h +s +r myhj.txt使用此命令隐藏了该文件。现在我无法在C中使用标准fopen()函数打开文件,因此我决定使用返回错误的GetFileAttributes()函数。根据{{​​3}},当函数成功时,返回值为MSDN

当程序尝试在下面运行printf()时,我不知道如何获取它们的值。当文件被隐藏时它也会稳定工作吗?如何使用其所有值访问隐藏文件?

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

FILE *log;

int main(int argc, char *argv[]) {

  if(GetFileAttributes("myhj.txt") == INVALID_FILE_ATTRIBUTES){
    printf("invalid get last error %d", GetLastError());
  }else{
    printf("%s", FILE_ATTRIBUTE_DIRECTORY);
  }

}

1 个答案:

答案 0 :(得分:5)

崩溃是因为%s期望以空字符结尾的字符串,但FILE_ATTRIBUTE_*常量是整数,所以最终尝试从无效的内存地址读取字符串。请改用%d

printf("%d", FILE_ATTRIBUTE_DIRECTORY);

GetFileAttributes()返回DWORDunsigned int,因此请使用%u

DWORD att = GetFileAttributes("myhj.txt");
if (att == INVALID_FILE_ATTRIBUTES) {
    printf("invalid get last error %d", GetLastError());
}
else {
    printf("%u", att);
} 

要检查特定值,请使用按位AND运算符(&)分别测试每个位:

DWORD att = GetFileAttributes("file.ext");
if (att == INVALID_FILE_ATTRIBUTES) {
  printf("error!\n");
}
else
{
  if (att & FILE_ATTRIBUTE_DIRECTORY) printf("directory\n");
  if (att & FILE_ATTRIBUTE_HIDDEN) printf("hidden\n");
  ...
}

如果您在文件上设置只读属性,则无法对其执行破坏性操作...