.net 如何查找Windows文件夹中的项目是否对用户真正隐藏?

.net 如何查找Windows文件夹中的项目是否对用户真正隐藏?,.net,windows,directory,explorer,file-attributes,.net,Windows,Directory,Explorer,File Attributes,我需要获得Windows文件夹中项目(文件夹和文件)的计数。我可以很容易地做它的基础上的条件,如果我应该包括隐藏的项目或不。但是在我的程序中,我想得到用户可见的项目数!i、 e.如果文件夹中的隐藏项可见,则应将其包括在计数中。如果隐藏的项目不可见,则不应包括在内 所以,我如何知道Windows计算机上是否设置了“显示隐藏文件”属性。换句话说,有没有一种方法可以让我发现一个文件或目录是否对用户“真正隐藏”(视觉上) 更新:我将重新打开此问题。虽然这里的原始答案回答了我的问题,但在某种程度上它并不是

我需要获得Windows文件夹中项目(文件夹和文件)的计数。我可以很容易地做它的基础上的条件,如果我应该包括隐藏的项目或不。但是在我的程序中,我想得到用户可见的项目数!i、 e.如果文件夹中的隐藏项可见,则应将其包括在计数中。如果隐藏的项目不可见,则不应包括在内

所以,我如何知道Windows计算机上是否设置了“显示隐藏文件”属性。换句话说,有没有一种方法可以让我发现一个文件或目录是否对用户“真正隐藏”(视觉上)

更新:我将重新打开此问题。虽然这里的原始答案回答了我的问题,但在某种程度上它并不是万无一失的。 以下是新的场景:

C驱动器中的某些文件(还没有其他地方)在视觉上是隐藏的,尽管它们的隐藏属性为false(或未选中),奇怪的是。这些文件在可见时看起来像其他隐藏文件(从文件夹选项),当我们在文件夹选项中设置“不显示隐藏文件”时(像任何其他普通隐藏文件),它们在视觉上被隐藏

我看到的机器中的那些文件是
autoexec.bat
config.sys
中的
C:\
。我在WindowsXP机器和Windows7机器上发现了这个。有没有办法识别这些文件?基本上,我是在尝试获取目录中可见(可视)文件的数量,而我的应用程序在尝试获取
C:\
中的文件数量时失败。发生的情况是,应用程序统计这两个文件(因为其属性未隐藏),但从视觉角度看,它们通常是隐藏的,如下所示:

string[] f = Directory.GetFiles(path);

int count = 0;
foreach (string s in f)
{
    FileInfo i = new FileInfo(s);
    if ((i.Attributes & FileAttributes.Hidden) == 0)
        count++;
}

return count;
因此,我认为唯一正确的方法是调用Shell API。我在找一个好的起跑手


谢谢..

Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\hidden
中有一个注册表项可用于检查有关“显示隐藏文件”的全局标志-请参阅

编辑:

请注意,还有另一个关于“显示系统文件”的设置,称为
ShowSuperHidden

Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\hidden
中有一个注册表项可用于检查有关“显示隐藏文件”的全局标志-请参阅

编辑:

请注意,还有另一个关于“显示系统文件”的设置,称为
ShowSuperHidden

此设置存储在注册表中,它位于:

User Key: [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\
Advanced]
Value Name: Hidden
Data Type: REG_DWORD (DWORD Value)
Value Data: (1 = show hidden, 2 = do not show)
访问此值的代码:

int hiddenValue = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\","Hidden",2);

if(hiddenValue == 1)
{
   //Files not hidden
}
else
{
   //Files are hidden
}

此设置存储在注册表中,它位于:

User Key: [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\
Advanced]
Value Name: Hidden
Data Type: REG_DWORD (DWORD Value)
Value Data: (1 = show hidden, 2 = do not show)
访问此值的代码:

int hiddenValue = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\","Hidden",2);

if(hiddenValue == 1)
{
   //Files not hidden
}
else
{
   //Files are hidden
}

autoexec.bat
和C:\中的
config.sys
是Yahia提到的系统文件,
ShowSuperHidden
设置

下面是检查文件是否为系统文件的方法。当文件属性为HSA时,表示隐藏、系统和文件已准备好存档。 下面是文件属性的列表

File attributes: 

A = Files ready for archiving 

H = Hidden 

C = Compressed 

HC is two attributes = Hidden & Compressed 

R = Read-only 

S = System 

HSA is three attributes = Hidden, System & Files ready for archiving 

E = Encrypted 

Encrypted files and folders cannot be compressed. 

资料来源:

C:\中的autoexec.bat
config.sys
是Yahia提到的系统文件,
ShowSuperHidden
设置

下面是检查文件是否为系统文件的方法。当文件属性为HSA时,表示隐藏、系统和文件已准备好存档。 下面是文件属性的列表

File attributes: 

A = Files ready for archiving 

H = Hidden 

C = Compressed 

HC is two attributes = Hidden & Compressed 

R = Read-only 

S = System 

HSA is three attributes = Hidden, System & Files ready for archiving 

E = Encrypted 

Encrypted files and folders cannot be compressed. 

资料来源:

欢迎您-注意,关于“显示系统文件”还有另一个设置,名为
ShowSuperHidden
…哦,我们必须通过在文件夹选项中选择另一个选项来显示系统文件夹和文件吗?希望您已经在您的答案中添加了一个部分,以便使答案完美。请批准:)如果此注册表项在不同版本的windows中更改,会发生什么情况?注册表重定向是否有影响?可能是这样,但使用Shell API将意味着对OP。。。据我所知,从Windos XP到Windows 7,注册表在这方面没有改变,这是一段很长的时间…欢迎您-注意,还有另一个关于“显示系统文件”的设置名为
ShowSuperHidden
…哦,是系统文件夹和文件,我们必须通过在文件夹选项中选择另一个选项使其可见吗?希望您已经在您的答案中添加了一个部分,以便使答案完美。请批准:)如果此注册表项在不同版本的windows中更改,会发生什么情况?注册表重定向是否有影响?可能是这样,但使用Shell API将意味着对OP。。。从我收集的信息来看,从Windos XP到Windows 7,注册表在这方面没有改变,这是一个非常长的时间…实现这一点的方法是询问shell,“嘿,你将向用户显示哪些项目?”而不是尝试复制shell算法。绑定到目录并调用IShellFolder::EnumObjects。@RaymondChen您能给我一个指向正确目标的链接吗?并不是说我找不到自己,而是它不能和你拿的一样好。你有很多选择,但也许最简单的方法是创建一个IShellItem,然后索要BHID_EnumItems。或者,您可以使用SHParseDisplayName、SHGetDesktopFolder、IShellFolder::BindToObject,然后是IShellFolder::EnumObjects的经典方法来实现。实现这一点的方法是询问shell,“嘿,您将向用户显示哪些项目?”而不是尝试复制shell算法。绑定到目录并调用IShellFolder::EnumObjects。@RaymondChen您能给我一个指向正确目标的链接吗?并不是说我找不到自己,而是它不能和你拿的一样好。你有很多选择,但也许最简单的方法是创建一个IShellItem,然后索要BHID_EnumItems。或者可以使用SHParseDisplayName、SHGetDesktopFolder、IShellFolder::BindToObject和