Побитовые операции & и ~ при установке атрибута файла
Цитата: Владимир от 20.10.2022, 19:58Добрый день, помогите пожалуйста разобраться, нашёл на форуме код для быстрого удаления папок:
public static void EmptyFolder(string[] array, string mask) { foreach (string x in array) { if (Directory.Exists(x)) { try { Directory.GetFiles(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y => { try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); } catch { } try { File.Delete(y); } catch { } }); Directory.GetDirectories(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y => { try { Directory.Delete(y, true); } catch { } }); } catch { } } } }Интересует меня конкретная строчка:
try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); } catch { }Хочу понять зачем в ней используются побитовые операции & и ~.
Мои расчеты такие:
FileAttributes.ReadOnly имеет интовое значение 1, кторое при применении оператора ~ превращаеться в -2.
Если файл имеет атрибут "Только для чтения", то метод File.GetAttributes(y) вернёт 1.
Далее, при использовании & между 1 и -2 получаем 0.Тут я запутался, почему 0?
На сколько я понял, цель – снять атрибут "Только для чтения", в таком случае:
Для чего вообще нужны все эти расчётны, не быстрее ли будет всегда передавать 0 в File.SetAttributes()? Также в File.SetAttributes можно передать FileAttributes.Normal, ведь в таком случае атрибут "Только для чтения" также убирается.Вопросов много, а ответы найти не получаеться, прошу знающих людей обьяснить устройство этого хитрого механизма.
Добрый день, помогите пожалуйста разобраться, нашёл на форуме код для быстрого удаления папок:
public static void EmptyFolder(string[] array, string mask)
{
foreach (string x in array)
{
if (Directory.Exists(x))
{
try
{
Directory.GetFiles(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y =>
{
try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); } catch { }
try { File.Delete(y); } catch { }
});
Directory.GetDirectories(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y =>
{
try { Directory.Delete(y, true); } catch { }
});
}
catch { }
}
}
}
Интересует меня конкретная строчка:
try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); } catch { }
Хочу понять зачем в ней используются побитовые операции & и ~.
Мои расчеты такие:
FileAttributes.ReadOnly имеет интовое значение 1, кторое при применении оператора ~ превращаеться в -2.
Если файл имеет атрибут "Только для чтения", то метод File.GetAttributes(y) вернёт 1.
Далее, при использовании & между 1 и -2 получаем 0.
Тут я запутался, почему 0?
На сколько я понял, цель – снять атрибут "Только для чтения", в таком случае:
Для чего вообще нужны все эти расчётны, не быстрее ли будет всегда передавать 0 в File.SetAttributes()? Также в File.SetAttributes можно передать FileAttributes.Normal, ведь в таком случае атрибут "Только для чтения" также убирается.
Вопросов много, а ответы найти не получаеться, прошу знающих людей обьяснить устройство этого хитрого механизма.