文件属性选择错误

时间:2014-09-19 18:55:27

标签: c# file file-attributes

我有这个代码,你可以选择特定的文件属性,但由于某种原因,它的表现非常奇怪。有人能发现错误吗?

这是一种形式,我在选择文件时触发checkAttributes。 (字符串)path是所选文件的路径。

private async void Dropdown_File_Attr_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    try
    {
        foreach (FileAttributes attr in Enum.GetValues(typeof(FileAttributes)))
            if (e.ClickedItem.Text == attr.ToString() && !(bool)e.ClickedItem.Tag)
                File.SetAttributes(path, File.GetAttributes(path) | attr);

            else if (e.ClickedItem.Text == attr.ToString() && (bool)e.ClickedItem.Tag)
                File.SetAttributes(path, File.GetAttributes(path) & ~attr);

        checkAttributes(path);

        await WaitX(5);
        Dropdown_File.ShowDropDown();
        Dropdown_File_Attr.ShowDropDown();
    }

    catch (Exception ex) { MessageBox.Show("An error occured:\n\n" + ex.ToString(), "Error"); }
}

public async Task WaitX(int miliseconds) { await Task.Delay(miliseconds); }

private List<string> getAttributes(string ppath)
{
    List<string> result = new List<string>();

    FileAttributes attrs = File.GetAttributes(ppath);

    if ((attrs & FileAttributes.Archive) == FileAttributes.Archive) result.Add("Archive");
    if ((attrs & FileAttributes.Compressed) == FileAttributes.Compressed) result.Add("Compressed");
    // This goes on for every attribute

    return result;
}

private void checkAttributes(string ppath)
{
    foreach (string s in getAttributes(ppath))
        foreach (ToolStripDropDownItem item in Dropdown_File_Attr.DropDownItems)
        {
            if (item.Text == s)
            {
                item.Image = Resources.check;
                item.Tag = true; // isChecked
            }
            else
            {
                item.Image = Resources.cross;
                item.Tag = false; // isChecked
            }
         }
}

只是一个例子:

如果在开始时只选择了Normal,我选择Hidden,Hidden是唯一一个有十字架的。如果然后选择ReadOnly,ReadOnly是唯一一个有交叉的,但如果我检查,该文件仍然在Windows资源管理器中隐藏。

我一直在寻找错误时间。任何人都可以帮助我(我没有很多关于Enums和FileAttributes的经验)?

1 个答案:

答案 0 :(得分:1)

循环显示下拉列表的所有项目,但仅对所单击的项目执行操作。你必须检查所有的项目。并将它们的值组合起来构造最终的属性值,或者你永远不会捕获自动清除的项目。或者只设置一个checked属性,而不将其与文件的当前标志组合,id你只想设置一个。

顺便说一下,你的逻辑可以用于多选,但我还是允许的。例如,允许设置文件隐藏和只读是有意义的。