1

特定のファイル属性を選択できると思われるこのコードがありますが、何らかの理由で非常に奇妙な動作をしています。誰でもエラーを見つけることができますか?

これはフォーム内にあり、ファイルが選択されたときに checkAttributes をトリガーしています。(string)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 の経験があまりありません)?

4

1 に答える 1

1

ドロップダウンのすべてのアイテムをループしますが、クリックされたアイテムのみに作用します。すべての項目をチェックする必要があります。それらの値を組み合わせて最終的な属性値を構築しないと、自動的にクリアされたアイテムをキャッチできません。または、ファイルの現在のフラグと組み合わせずに、チェックされた属性を1つ設定するだけです.とにかく1つだけを設定したい場合。

余談ですが、あなたのロジックは複数選択で機能しますが、とにかく許可します。たとえば、ファイルを非表示および読み取り専用に設定できるようにすることは理にかなっています。

于 2014-09-19T19:08:01.430 に答える