有没有更好的办法?

时间:2010-09-20 20:38:12

标签: c# .net file

有没有更好的方法来做到这一点。

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);
                    }
                }
            }

        }

`

4 个答案:

答案 0 :(得分:5)

是的,因为您有一个FileInfo对象,您可以使用Attributes属性,而不是使用File.GetAttributesFile.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,所以多次将它设置为相同的值不会对任何事情造成伤害。