1

私は最近、stackoverflow で大きな助けを得ました。回答の 1 つにやや戸惑いましたが、コメント ボックスの制限により、説明を得るのが適切ではないと感じました。

以下のコードを確認してください。

if ((File.GetAttributes(fileName) & FileAttributes.Archive) == FileAttributes.Archive)
{
    // Archive file.
}

私の質問は、& (太字を参照)
(File.GetAttributes(fileName) & FileAttributes.Archive ) == などの後にロジックを含める理由です。

確かに FileAttributes.Archive == FileAttributes.Archive は常に一致しますか?

これについて説明がある人はいますか(IMOはおそらくタイプミス/間違いですが、後で修正するにはあまりにも多くのことを想定していました!)

~2 番目の質問は、このコードでチルダが何をするかです。

File.SetAttributes(fileName, File.GetAttributes(fileName) & ~FileAttributes.Archive);
4

5 に答える 5

2

File.GetAttributes メソッドは、メンバー値のビット単位の組み合わせを可能にする Flags 属性を持つ列挙を返します。つまり、関連するすべての属性のすべてのビット値が、1 つの整数オブジェクトに結合されます。「&」またはビットごとの and 演算子を使用すると、オブジェクトの関連ビットを引き出すことができます。元の属性との比較はわかりやすくするためのものです。単純にゼロ以外の値を探すことも同様に論理的に正しいでしょう。

http://msdn.microsoft.com/en-us/library/system.io.fileattributes.aspx

于 2012-10-23T09:54:44.360 に答える
2

問題は、それFileAttributesFlags属性を持っていることです。すべての値を組み合わせることができることを意味します (例: Archive AND Hidden)。

本当に特定の値が設定されているかどうかを調べるには、他のすべての値をマスクする必要があります。この目的のために、例では次のように使用できるクラスHasFlag内のメソッドも存在します。Enum

if(File.GetAttributes(fileName).HasFlag(FileAttributes.Archive))
{
    // Archive file.
}

2 番目の例では、ビットマスクから正確な値を削除します。したがって、マスク内の他のすべてのビット (読み取り専用または非表示など) に触れることなく、アーカイブ属性を削除します。このタスクでは、enum クラス内にメソッドは存在しません。

于 2012-10-23T09:50:38.240 に答える
1

「~」演算子はビットごとの NOT (補数) です。ビットごとの補数演算子を参照してください

于 2012-10-23T09:57:14.900 に答える
1

これは、いわゆるマスク比較です。

(File.GetAttributes(fileName) & FileAttributes.Archive)
    return FileAttributes.Archive

属性に FileAttributes.Archive がある場合、それ以外の場合は false を返します。

例:

ファイル属性に値がある場合:

hidden  archive readonly 
   1       1       0

ビット単位と(File.GetAttributes(fileName) & FileAttributes.Archive)

戻り値

hidden  archive readonly 
   0       1       0

と等しいFileAttributes.Archiveです。

ファイル属性に値がある場合:

hidden  archive readonly 
   1       0       1

ビット単位と(File.GetAttributes(fileName) & FileAttributes.Archive)

戻り値

hidden  archive readonly 
   0       0       0
于 2012-10-23T09:51:16.337 に答える