我有这个代码,你可以选择特定的文件属性,但由于某种原因,它的表现非常奇怪。有人能发现错误吗?
这是一种形式,我在选择文件时触发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的经验)?
答案 0 :(得分:1)
循环显示下拉列表的所有项目,但仅对所单击的项目执行操作。你必须检查所有的项目。并将它们的值组合起来构造最终的属性值,或者你永远不会捕获自动清除的项目。或者只设置一个checked属性,而不将其与文件的当前标志组合,id你只想设置一个。
顺便说一下,你的逻辑可以用于多选,但我还是允许的。例如,允许设置文件隐藏和只读是有意义的。