2016-09-05 1 views
1

den Code unten Betrachten -Warum ist der FileAttributes-Wert für eine Datei, die nicht existiert -1?

FileInfo fileInfo = new FileInfo("C:\\doesNotExist.txt"); 
Console.WriteLine(fileInfo.Attributes); 
Console.WriteLine(fileInfo.Attributes.HasFlag(FileAttributes.ReadOnly)); 

Gemäß den documentation der Standard zugrunde liegende Typ für eine Aufzählung ist int und ein int mit einem Wert von -1 sind im Grunde alle 1s in binär. Da FileAttributes eine bitweise Kombination seiner Memberwerte erlaubt (as stated here), warum ist der Standardwert für FileAttributes -1, da dies bedeuten würde, dass eine Datei, die nicht existiert, alle möglichen FileAttributes besitzt (der obige Code druckt True für die dritte) Zeile)

+0

Abwärtskompatibilität. Verwenden Sie File.GetAttributes() stattdessen, es wirft. –

Antwort

1

Dies ist nur eine Vermutung und die Quelle ist verwirrend, aber es sieht so aus, als könnte der Code den Unterschied zwischen Daten, die nicht initialisiert wurden - dh ein int auf Null gesetzt - und Daten, die gewesen sind initialisiert, hat aber keinen Wert, wie die Dateiattribute einer nicht vorhandenen Datei.

Vom source code for File.FillAttributeInfo

// Returns 0 on success, otherwise a Win32 error code. Note that 
// classes should use -1 as the uninitialized state for dataInitialized. 

Und then, wenn die Datei nicht gefunden wird:

if (!returnErrorOnNotFound) { 
    // Return default value for backward compbatibility 
    dataInitialised = 0; 
    data.fileAttributes = -1; 
} 

Es scheint vernünftig Anrufer zu erwarten zu überprüfen, dass die Exists der Fileinfo-Eigenschaft true ist, bevor die Attribute zugreifen.

Verwandte Themen