GetFileAttributes为不存在的文件返回FILE_ATTRIBUTE_ARCHIVE

GetFileAttributes returning FILE_ATTRIBUTE_ARCHIVE for nonexistent file

本文关键字:FILE ATTRIBUTE ARCHIVE 返回 文件 不存在 GetFileAttributes      更新时间:2023-10-16

我在创建文件之前使用GetFileAttributes来检查是否存在,并向用户显示一个对话框(标准的"是否要替换现有文件")

if (GetFileAttributes(szFilePath) != 0xffffffff) { /* display "do you want to replace?"*/}
有时候,对于不可能存在的文件,它会返回成功,因为它所在的文件夹已经创建了(使用CreateDirectory)。当它这样做时,它返回的属性只是FILE_ATTRIBUTE_ARCHIVE。

知道是怎么回事吗?

编辑:为了回应无休止的"你应该使用INVALID_FILE_ATTRIBUTES"系列,我已经这样做了。

DWORD dwFile = GetFileAttributes(szFilePath);
if (dwFile != INVALID_FILE_ATTRIBUTES) { /* display "do you want to replace?"*/}

得到相同的结果。对于不存在的文件,dwFile返回FILE_ATTRIBUTE_ARCHIVE。我很肯定它不存在。文件夹刚刚创建。我没有使用GetTempFileName()。我可以从调试器复制szFilePath,并使用资源管理器和命令行访问文件夹,两者都不显示文件存在。

好吧,原来这是DOS遗留下来的。具体的文件名很重要。下面的代码行将重现这个问题,假设您的系统上不存在c:aux.c,并且您有一个"c"驱动器。(我最初遇到这种行为是在树的深处,但这是一个很好的最小情况。)

DWORD dwFile = GetFileAttributes(TEXT("C:\aux.c"));

这和SuperUser上的问题有关为什么这个文件在试图删除时明显不存在?有些文件名是受保护的,即使该文件实际上不存在,或者从未存在过。

CON, PRN, AUX, CLOCK$, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 lptt1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9。

这些都是受保护的,如果你遇到在windows上编辑/创建/删除它们的情况,可能会导致问题。