【问题标题】:Don't show hidden files in a directory listview [closed]不要在目录列表视图中显示隐藏文件[关闭]
【发布时间】:2013-01-08 20:01:29
【问题描述】:

我有代码可以生成我的计算机的 listview 目录。当我打开 C 目录时,它显示 $RECYCLE.Bin。反正有它不显示这些文件的地方吗?

foreach (string dir in folders)
{
    dirData[0] = dir.ToString();
    dirData[1] = dir.Length.ToString();
    dirData[2] = File.GetLastAccessTime(dir).ToString();
    ListViewItem lv = new ListViewItem(dirData, imageList1.Images.Count - 1);
    lv.Tag = dir;

    imageList1.Images.Add(BlackFox.Win32.Icons.IconFromExtensionShell(".*", BlackFox.Win32.Icons.SystemIconSize.Small).ToBitmap());

    listView1.SmallImageList = imageList1;
    listView1.Items.Add(lv);
}

【问题讨论】:

  • 请阅读faqHow to Ask几遍,拜托..
  • :) 我只是想问一下系统文件是否在 c# listview 中处理......我复制粘贴我的整个代码是不是很疯狂:/
  • 您应该发布一些代码。我们无法猜测您的 IDE 中有什么,而这个问题没有代码就没有答案
  • @engineer41 - 不一定是您的“完整代码”,但至少是您遇到的问题的相关代码。如果没有您编写的代码示例,您的问题就太模糊了。
  • 更新...抱歉打扰

标签: c# winforms listview


【解决方案1】:
var dirs = Directory.GetDirectories(@"C:\")
             .Select(d => new { Attr = new DirectoryInfo(d).Attributes, Dir = d })
             .Where(x => !x.Attr.HasFlag(FileAttributes.System))
             .Where(x => !x.Attr.HasFlag(FileAttributes.Hidden))
             .Select(x => x.Dir)
             .ToList();

这不仅会忽略System+HiddenC:\$Recycle.Bin 目录,还会忽略C:\$AVG8.VAULT$,它不是System 目录并被病毒扫描程序使用。

【讨论】:

  • 您可以将您的 where 子句更改为:.Where(x => !x.Attr.HasFlag(FileAttributes.System && !x.Attr.HasFlag(FileAttributes.Hidden)
  • @CAbbott 为什么?我觉得这更易读。
  • @CAbbott 可以。我认为这是品味问题。我喜欢完全链接的 where 子句,因为它们很容易删除/添加/更改。
  • 我不明白这个alian VB lang..但我猜你说要指定那个文件属性!=隐藏
  • ...它是 C#。 Linq,准确地说是使用方法表达式语法,带有 lambda 谓词。
【解决方案2】:

这样的东西应该可以工作

var folders = Directory.GetDirectories(@"C:\")
.Where(d => !new DirectoryInfo(d).Attributes.HasFlag(FileAttributes.System | FileAttributes.Hidden));

foreach (string dir in folders)
{
   .....

让我扩展答案,因为有些人可能会觉得难以理解,这将忽略 SystemHidden 目录。

即:

"C:\\$Recycle.Bin"

"C:\\Documents and Settings"

"C:\\System Volume Information"

如果您想忽略所有隐藏目录,您可以简单地从 linq 语句中省略 FileAttributes.System 属性,但这会导致在您的 ListView 中丢失像 ProgramData 这样的目录,我不确定您是否想要。

【讨论】:

  • 您的答案将返回只有SystemHidden 的目录。您试图复制我的答案并简化它,但它不正确。
  • 阅读代码,它清楚地返回任何非系统/隐藏的内容,而且我没有复制您的代码,因为您的大部分行根本不需要,并且对于简单的操作会造成混淆。跨度>
  • sa_ddam213,我所做的不仅仅是阅读您的代码并对其进行了测试。它返回无效结果,例如 only-Hidden 目录,如 ProgramDataC:\$AVG8.VAULT$
  • 你在说什么,! 表示错误,我不知道为什么它对你不起作用,我已经使用这行代码多年了
  • 你的问题是什么,这将隐藏他要求的隐藏系统文件夹
【解决方案3】:

对列表视图项目运行迭代并删除它们扩展为 .bin 的项目。

你可以用这段代码找到.bin(化名):

for(int i=0;i<items_count;i++)
{
  if(listview1.items[i].Substring(listview1.items[i].length-3,listview1.items[i].length)=="bin")
   listview1.items.remove(i);
}

另一个化名: 如果你想概括这一点,你应该对列表视图项使用这样的文件属性类:

string filePath = listview1.items[i];

// get file attributes
System.IO.FileAttributes fileAttributes = System.IO.File.GetAttributes(filePath);

现在你应该检查 fileAttributes 是否隐藏,删除相应的项目。

注意:下次请发一些你的代码行,更好的解决问题。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2016-10-22
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2018-09-22
    • 1970-01-01
    相关资源
    最近更新 更多