在C# .Net 2.0中处理文件属性

3

那么我如何递归搜索文件夹并显示目录中的所有文件和子文件夹?就像检查每个文件和每个文件夹一样...如果它们被隐藏了...解除隐藏。我整个早上都在试验,但没有成功...我已经将所有文件夹设置回正常状态,但仅此而已。


请提供您当前正在使用的代码。 - Akram Shahda
显示/隐藏目录,而不是文件。 - Hans Passant
3个回答

4
foreach (var filePath in Directory.GetFiles(@"C:\Temp2"))
{
    Console.Write("File " + filePath);

    FileAttributes fileAttribute = File.GetAttributes(filePath);

    if ((fileAttribute & FileAttributes.Hidden) > 0)
    {
        Console.WriteLine(" is hidden.");

        // unset the hidden flag, but do not change other flags:
        File.SetAttributes(filePath, fileAttribute & ~FileAttributes.Hidden);
    }
    else
    {
        Console.WriteLine(" is not hidden.");
    }
}

如果要递归地执行此操作,请使用

Directory.GetFiles(@"C:\Temp2", "*", SearchOption.AllDirectories)

要包括目录,请使用GetFileSystemEntries

Directory.GetFileSystemEntries(@"C:\Temp2", "*", SearchOption.AllDirectories)

0
这样行吗?
foreach (var file in directory.GetFiles())
{
    if ((File.GetAttributes(file.FullName) & FileAttributes.Hidden) == FileAttributes.Hidden)
    {
         File.SetAttributes(file.FullName, FileAttributes.Normal);
    }
}

0

这可以很容易地通过递归来解决。

文件属性,如“hidden”,被指定为枚举标志,并且最容易使用位运算进行设置或清除。您可以通过获取该路径的FileInfoDirectoryInfo来查看文件或目录的属性。

// startDir assumed to be full path
public static void UnhideAll(string startDir)
{
    DirectoryInfo dir = new DirectoryInfo(startDir);
    Console.WriteLine("Working in {0}", startDir);
    // First, clear hidden flag on the current directory (if needed)
    if ((dir.Attributes & FileAttributes.Hidden) != 0)
    {
        Console.WriteLine("Clearing hidden flag on dir");
        dir.Attributes &= ~FileAttributes.Hidden;
    }
    else
        Console.WriteLine("No need to clear flag since it's already non-hidden");

    // Second, recursively go into all sub directories
    foreach (var subDir in dir.GetDirectories())
        UnhideAll(subDir.FullName);

    // Third, fix all hidden files in the current folder
    foreach (var file in dir.GetFiles())
    {
        if ((file.Attributes & FileAttributes.Hidden) != 0)
        {
            Console.WriteLine("Clearing hidden flag on file {0}", file.FullName);
            file.Attributes &= ~FileAttributes.Hidden;
        }
        else
            Console.WriteLine("Skipping {0} since it's not hidden", file.FullName);
    }
}    

您现在可以通过调用递归功能来取消隐藏目录中的所有隐藏文件

UnhideAll(@"C:\SomePath\That\Should\Be\Unhidden");

当然,在使用此代码时,您需要删除所有对Console.WriteLine的调用,但我将它们留在那里,以便您在代码运行时更轻松地查看正在发生的情况。以下是更简洁的版本:
// startDir assumed to be full path
public static void UnhideAll(string startDir)
{
    DirectoryInfo dir = new DirectoryInfo(startDir);
    // First, clear the current directory
    dir.Attributes &= ~FileAttributes.Hidden;
    // Second, recursively go into all sub directories
    foreach (var subDir in dir.GetDirectories())
        UnhideAll(subDir.FullName);

    // Third, fix all hidden files in this folder
    foreach (var file in dir.GetFiles())
        file.Attributes &= ~FileAttributes.Hidden;
}    

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