2016-07-11 13 views
1

Normalerweise gibt GetFileAttributesW(L"C:")0x10 (FILE_ATTRIBUTE_DIRECTORY) zurück, was vernünftig ist.Warum gibt GetFileAttributesW (L "C:") FILE_ATTRIBUTE_REPARSE_POINT zurück?

In einigen Fällen GetFileAttributesW(L"C:") kehrt 0x2416 (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)

Ich frage mich, was es davon passieren und wie man macht befreien. Dieses Problem macht boost::filesystem::canonical kann nicht funktionieren. Hast du irgendeine Idee?

+0

Das sieht für mich vollkommen vernünftig aus. Warum denken Sie, dass GetFileAttributesW defekt ist? –

+2

'C:' ist nicht dasselbe wie 'C: \\'. Es ist das aktuelle Arbeitsverzeichnis, das sich je nach Programm ändern kann. –

+0

@RichardCritten Meinst du "C:" bezieht sich auf "aktuelles Arbeitsverzeichnis", was sich sehr von meinem ursprünglichen Gedanken unterscheidet. Können Sie mir etwas geben, um es zu beweisen? –

Antwort

7

Die Haupt Verwirrung hier ist, was C: bedeutet. Dies wird als das aktuelle Verzeichnis auf dem Laufwerk C interpretiert. Dies wird auf MSDN erläutert: Naming Files, Paths, and Namespaces.

Wenn ein Dateiname beginnt mit nur einer Plattenkennung jedoch nicht die Backslash nach dem Doppelpunkt wird als ein relativer Pfad zum aktuellen Verzeichnis auf dem Laufwerk mit dem angegebenen Buchstaben interpretiert. Beachten Sie, dass das aktuelle Verzeichnis das Stammverzeichnis sein kann oder nicht, abhängig davon, auf, was es während des letzten "Change Directory" Vorgangs auf diesem Datenträger festgelegt wurde. Beispiele für dieses Format sind wie folgt:

  • "C: tmp.txt" bezieht sich auf eine Datei mit dem Namen "tmp.txt" im aktuellen Verzeichnis auf Laufwerk C
  • „C: tempdir \ tmp.txt "bezieht sich auf eine Datei in einem Unterverzeichnis in das aktuelle Verzeichnis auf Laufwerk C:

So ist der Rückgabewert von GetFileAttributesW(L"C:") hängt davon ab, was das aktuelle Verzeichnis. Ich glaube, dass Sie beabsichtigen, die Attribute des Stammordners zu erhalten, in diesem Fall müssen Sie GetFileAttributesW(L"C:\\") verwenden.