c ++ - Indstil filattribut succed, men retriving det fejler

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger SetFileAttributesW til at indstille custome-filattribut, f.eks. 0x200008, og SetFileAttributesW returnerer nonzero betyder, at der ikke er nogen fejl. men GetFileAttributesW henter filattribut ignorerer sæt attributten.


int main()
{
    uint32\_t magic = 0x200008;
    DWORD attribute = GetFileAttributesW(L"test");
    cout << attribute << endl;
    if ((attribute & magic) == magic)
        cout << "has magic" << endl;
    else
    {
        attribute |= magic;
        cout << attribute << endl;
    }
    cout << SetFileAttributesW(L"test", attribute) << " " << GetLastError();
    cin.get();
    return 0;
}


og output for hver runde

32

2097192

1 0


Enhver kan hjælpe mig?


Bedst.

Bedste reference


ikke nogen attributter gyldige, hvis du ser i wmd.h , kan du finde næste definition:


#if (\_WIN32\_WINNT < \_WIN32\_WINNT\_WIN8)

#define FILE\_ATTRIBUTE\_VALID\_FLAGS          0x00007fb7
#define FILE\_ATTRIBUTE\_VALID\_SET\_FLAGS      0x000031a7

#else

#define FILE\_ATTRIBUTE\_VALID\_FLAGS          0x0002ffb7
#define FILE\_ATTRIBUTE\_VALID\_SET\_FLAGS      0x000231a7

#endif


så din brugerdefinerede filattribut 0x200008 ikke er gyldig og vil være udefineret adfærd. men i de nuværende implementeringsfilsystemer ignoreres værdier, som de ikke forstår i stedet for returfejl
Se FASTFAT-kilden: [4]


    //
    //  Only permit the attributes that FAT understands.  The rest are silently
    //  dropped on the floor.
    //



    Attributes = (UCHAR)(Buffer->FileAttributes & (FILE\_ATTRIBUTE\_READONLY |
                                                   FILE\_ATTRIBUTE\_HIDDEN |
                                                   FILE\_ATTRIBUTE\_SYSTEM |
                                                   FILE\_ATTRIBUTE\_DIRECTORY |
                                                   FILE\_ATTRIBUTE\_ARCHIVE));


NTFS gør det samme.


så brug kun attributter, der er angivet i Windows header-filer og i masken FILE\_ATTRIBUTE\_VALID\_SET\_FLAGS

Andre referencer 1


Det ser ud til at du bruger en værdi, der ikke understøttes. 0x200008 er ikke dokumenteret af Microsoft.


Se for understøttede konstanter: [[https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx]]
int main()
{
    uint32\_t magic = 0x200008;
    DWORD attribute = GetFileAttributesW(L"test");
    cout << attribute << endl;
    if ((attribute & magic) == magic)
        cout << "has magic" << endl;
    else
    {
        attribute |= magic;
        cout << attribute << endl;
    }
    cout << SetFileAttributesW(L"test", attribute) << " " << GetLastError();
    cin.get();
    return 0;
}
[5]