0

我有生成我计算机的 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);
}
4

3 回答 3

3
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+Hidden目录,C:\$Recycle.Bin而且还会忽略病毒扫描程序使用的C:\$AVG8.VAULT$非目录。System

于 2013-01-08T20:11:36.917 回答
0

对列表视图项目运行迭代并删除它们扩展为 .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 是否隐藏,删除相应的项目。

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

于 2013-01-08T20:12:38.857 回答
0

像这样的东西应该工作

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

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

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

IE:

"C:\\$Recycle.Bin"

"C:\\Documents and Settings"

"C:\\System Volume Information"

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

于 2013-01-08T20:25:20.367 回答