Работа с файловыми атрибутами в C# .Net 2.0
Итак, как я могу рекурсивно искать в папке и скрывать ВСЕ файлы и подпапки в каталоге? Например, проверить каждый файл и каждую папку... если они скрыты... убрать их. Я бездельничал с этим все утро без удачи... я получил все папки, чтобы вернуться в нормальное состояние, но это об этом.
3 ответа
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)
Как насчет этого?
foreach (var file in directory.GetFiles())
{
if ((File.GetAttributes(file.FullName) & FileAttributes.Hidden) == FileAttributes.Hidden)
{
File.SetAttributes(file.FullName, FileAttributes.Normal);
}
}
Это легко решается с помощью рекурсии.
Атрибуты файла, такие как "скрытый", указываются в качестве флага перечисления и наиболее легко устанавливаются или очищаются с помощью битовых операций. Вы можете увидеть атрибуты файла или каталога, получив FileInfo или DirectoryInfo для этого пути.
// 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;
}