有没有更好的方法来做到这一点。
FileInfo f = new FileInfo("C://notebook.txt");`
public bool Archived
{
get
{
return (((File.GetAttributes(f.FullName))
& FileAttributes.Archive) == FileAttributes.Archive);
}
set
{
if (value == true)
{
if (!this.Archived)
{
File.SetAttributes(f.FullName,
File.GetAttributes(f.FullName) | FileAttributes.Archive);
}
}
else if (value == false)
{
if (this.Archived)
{
File.SetAttributes(f.FullName,
File.GetAttributes(f.FullName)
& ~FileAttributes.Archive);
}
}
}
}
`
答案 0 :(得分:5)
是的,因为您有一个FileInfo
对象,您可以使用Attributes
属性,而不是使用File.GetAttributes
和File.SetAttributes
方法:
public bool Archived {
get {
return (f.Attributes & FileAttributes.Archive) != 0;
}
set {
if (value) {
if (!this.Archived) {
f.Attributes |= FileAttributes.Archive;
}
} else {
if (this.Archived) {
f.Attributes &= ~FileAttributes.Archive;
}
}
}
}
答案 1 :(得分:2)
嗯,您可以随时开始简化处理setter中value
的方式。然后你可以通过读取setter顶部的属性来避免双重获取。
public bool Archived
{
get
{
return (((File.GetAttributes(f.FullName)) & FileAttributes.Archive) != 0);
}
set
{
var attributes = File.GetAttributes(f.FullName);
bool archived = ((attributes & FileAttributes.Archive) != 0);
if (value)
{
if (!archived)
File.SetAttributes(f.FullName, attributes | FileAttributes.Archive);
}
else
{
if (archived)
File.SetAttributes(f.FullName, attributes & ~FileAttributes.Archive);
}
}
}
现在,Guffa对FileInfo
缓存的属性有一点意见,尽管我认为这更像是反对使用FileInfo
的论据。我更喜欢将路径名存储为字符串。
我也改变了位测试以比较为零,我本来应该做的。谢谢,KeithS和Guffa。
并且,为了将它们保存在一个地方,如果我们使用C#4.0,我们可以说:
bool archived = attributes.HasFlag(FileAttributes.Archive);
答案 2 :(得分:1)
不,这在处理标记(按位)值时非常标准。
你可能想失去else if
位,因为布尔通常只有2个状态。
答案 3 :(得分:0)
在getter中,如果按位AND计算任何非零,该位的设置,那么你的getter可以稍微缩短:
get
{
return (((File.GetAttributes(f.FullName)) & FileAttributes.Archive) != 0);
}
其他一切都非常优秀;你可以通过去除围绕if和else的setter的括号来丢失一些括号和一个评估,并使“else if”只是一个“else”。或者,结合内外表达;实际上,内部表达式不一定是1 | 1 == 1和1& 〜1 == 0,所以多次将它设置为相同的值不会对任何事情造成伤害。