【问题标题】:How to make difference between FileInfo and DirectoryInfo in a file explorer in list view如何在列表视图中的文件资源管理器中区分 FileInfo 和 DirectoryInfo
【发布时间】:2019-03-16 16:22:05
【问题描述】:

我想用 Windows 窗体创建一个文件资源管理器,我已经做了一些事情,但是当我想使用我的 ListView 的 DoubleClick 事件时,我不知道如何编写文件资源管理器需要在不同时采取不同的行动我双击文件或文件夹。

我的目标是:

  1. 单击文件 - 将其文本加载到 TextBox 中
  2. 单击一个目录 - 打开它并将其加载到列表视图中。

我也知道如何做 1. 和 2.,我只是不知道如何让我的 DoubleClick 函数知道 ListView 中的选定项目是 1. 还是 2.

我这样构建我的 ListView:

private void miOpen_Click(object sender, EventArgs e)
{
    InputDialog dlg = new InputDialog();
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        DirectoryInfo parentDI = new DirectoryInfo(dlg.Path);
        listView1.Items.Clear();
        try
        {
            foreach (DirectoryInfo df in parentDI.GetDirectories())
            {
                ListViewItem lvi = new ListViewItem(new string[] { 
                df.Name, df.Parent.ToString(), 
                df.CreationTime.ToShortDateString(), df.FullName });
                listView1.Items.Add(lvi);
            }

            foreach (FileInfo fi in parentDI.GetFiles())        
            {                                                   
                ListViewItem lvi = new ListViewItem(new string[] { 
                fi.Name, fi.Length.ToString(), 
                fi.CreationTime.ToShortDateString(), fi.FullName } );
                listView1.Items.Add(lvi);
            }
        }
        catch { }
    }
}

【问题讨论】:

  • 如何将文件和目录放入 ListView?无论做什么,都必须存储它放置的是文件还是目录。您的 DoubleClick 也必须使用存储的内容。
  • switch (listViewItem) { case DirectotyInfo di: DoDirectoryThings(di); break; case FileInfo fi: DoFileThings(fi); break; }
  • 我编辑了我的原始帖子,抱歉我忘了写下来。
  • 你有一个空的 catch 语句......你可能隐藏了一个问题......空的 catch 语句总是不好的......你可能想要修改你给用户的消息......但作为程序员......你总是想知道发生了什么以便采取适当的行动
  • 您没有分配ListViewItem 任何DirectotyInfoFileInfo。如果您将其分配给 Tag 属性,您可以稍后测试 Tag 是一个还是另一个,例如使用我之前评论中的 switch 语句。

标签: c# listview windows-forms-designer fileinfo directoryinfo


【解决方案1】:

DirectoryInfoFileInfo 对象添加到ListViewItemTag 属性。即

...
var lvi = new ListViewItem(new string[] { 
    df.Name,
    df.Parent.ToString(), 
    df.CreationTime.ToShortDateString(),
    df.FullName
});
lvi.Tag = df;
listView1.Items.Add(lvi);
...

或文件信息:

lvi.Tag = fi;

然后,在列表视图中选择一个项目后:

private void btnTest_Click(object sender, EventArgs e)
{
    // Show the first item selected as an example.
    if (listView1.SelectedItems.Count > 0) {
        switch (listView1.SelectedItems[0].Tag) {
            case DirectoryInfo di:
                MessageBox.Show($"Directory = {di.Name}");
                break;
            case FileInfo fi:
                MessageBox.Show($"File = {fi.Name}");
                break;
            default:
                break;
        }
    }
}

【讨论】:

    【解决方案2】:

    试试这个代码:

    FileAttributes fileAttributes = File.GetAttributes("C:\\file.txt");
    
    if (fileAttributes.HasFlag(FileAttributes.Directory))
        Console.WriteLine("This path is for directory");
    else
        Console.WriteLine("This path is for file");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2013-01-12
      • 2010-09-25
      • 1970-01-01
      • 2011-10-12
      相关资源
      最近更新 更多