什么是在.NET(C#)中检查重解析点的最佳方法?

4

我的函数基本上是一个标准的搜索函数...我在下面包含了它。

在这个函数中,我有一行代码负责清除Repart NTFS点。

if (attributes.ToString().IndexOf("ReparsePoint") == -1)

现在的问题是我收到了一个错误信息:访问路径'c:\System Volume Information'被拒绝。

我已经调试了代码,发现这个目录在运行时只有以下属性:

  System.IO.FileAttributes.Hidden 
| System.IO.FileAttributes.System 
| System.IO.FileAttributes.Directory

我在一台Windows 2008服务器上执行此代码,有什么办法可以解决这个失败的问题吗?
public void DirSearch(string sDir)
{
    foreach (string d in Directory.GetDirectories(sDir))
    {
        DirectoryInfo dInfo = new DirectoryInfo(d);
        FileAttributes  attributes = dInfo.Attributes;
        if (attributes.ToString().IndexOf("ReparsePoint") == -1)
        {
            foreach (string f in Directory.GetFiles(d, searchString))
            {
                //lstFilesFound.Items.Add(f);
                ListViewItem lvi;
                ListViewItem.ListViewSubItem lvsi;
                lvi = new ListViewItem();
                lvi.Text = f;
                lvi.ImageIndex = 1;
                lvi.Tag = "tag";
                lvsi = new ListViewItem.ListViewSubItem();
                lvsi.Text = "sub bugger";
                lvi.SubItems.Add(lvsi);

                lvsi = new ListViewItem.ListViewSubItem();
                lvsi.Text = d;//"C:\\Users\\Administrator\\Downloads\\MediaMonkey.GOLD.EDITION.v.3.0.2.1134.[Darkside].[Demonoid].[Grim.Reaper]";
                lvi.SubItems.Add(lvsi);

                listView1.Items.Add(lvi);
            }
            DirSearch(d);
        }
    }
}
3个回答

18

我不确定问题的答案是什么,但是更改您的属性检查,使用正确的位运算!

if (attributes.ToString().IndexOf("ReparsePoint") == -1)

...更正确的写法是...

if ((attributes & FileAttributes.ReparsePoint) == 0)

9
从.NET 4开始,可以使用if (attributes.HasFlag(FileAttributes.ReparsePoint))来判断是否为符号链接。 - Roman Starkov
HasFlag方法会进行一些不好的装箱操作,我建议一般情况下不要使用它。 - IS4
我保证使用HasFlag不会对您的应用程序的性能产生任何明显的影响,除非它是一个合成微基准。 - Greg Beech

3

除了SYSTEM帐户,没有人有访问System Volume Information的权限。因此,要么更改目录上的权限,要么更好地捕获异常并继续执行。


Stephen,感谢您的回答 - 看来我正在收到一些其他有趣的访问被拒绝的错误消息。我需要全面研究为什么会出现这种情况。Windows 2003从未出现过这样的问题。 - Michael L

0

一旦您通过权限,真正想要测试连接点时,这个类提供了通过使用DeviceIoControl kernel32调用和分析重解析点来测试、创建和删除连接点的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接