Доброго времени суток, перейду сразу к делу.... У меня имеется список процессов, в этом списке имеются названия процессов которые нужно пропускать, а те процессы, которых нет в списке названий необходимо убить. Вроде бы простая задачка, но возникают траблы. Пытался выполнить это таким образом: foreach (Process proc in Process.GetProcesses()) { if (!DontKillThis.Contains(proc.ProcessName.ToLower())) { proc.Kill(); } } Код foreach (Process proc in Process.GetProcesses()) { if (!DontKillThis.Contains(proc.ProcessName.ToLower())) { proc.Kill(); } } но всё равно убиваются все процессы, даже те которые в списке. Максимально тупая задачка, но решения не могу найти уже полтора часа, в чём может быть трабл? (Если будете предлагать решения, то пожалуйста не юзайте Linq)
Проще простого: List<string> name = new List<string>{"svchost", "csrss", "System", "wininit"}; foreach (Process anti in etc) // Обойдем каждый процесс { if (name.IndexOf(anti.ProcessName.ToLower())<0) // Если процесса нет в списке { anti.Kill(); } } Код List<string> name = new List<string>{"svchost", "csrss", "System", "wininit"}; foreach (Process anti in etc) // Обойдем каждый процесс { if (name.IndexOf(anti.ProcessName.ToLower())<0) // Если процесса нет в списке { anti.Kill(); } } И ещё чтобы свой случайно не грохнуть процесс, то делаем так: var etc = Process.GetProcesses(); var currentProcess = Process.GetCurrentProcess(); foreach (var anti in etc) { if (name.IndexOf(anti.ProcessName.ToLower()) < 0 && anti.ProcessName != currentProcess.ProcessName) { anti.Kill(); } } Код var etc = Process.GetProcesses(); var currentProcess = Process.GetCurrentProcess(); foreach (var anti in etc) { if (name.IndexOf(anti.ProcessName.ToLower()) < 0 && anti.ProcessName != currentProcess.ProcessName) { anti.Kill(); } }
wDude, Гугл всегда помогает находить нужную информацию... Вариант полностью рабочий, так что не надо выдумывать... Если что-то не работает дебаж и смотри что не так происходит с кодом, точку остановы и вперёд с песней.
r3xq1, проверял? Я лично проверял, даже создавал отдельное приложение и всё осуществлял в одном классе, чтобы точно не пропустить что либо, не вышло, мэби из-за того что список не в подобном формате: List<string> name = new List<string>{"svchost", "csrss", "System", "wininit"}; Код List<string> name = new List<string>{"svchost", "csrss", "System", "wininit"}; А просто в формате (хотя по факту разницы никакой): public List<string> DontKillThis = new List<string>(); Код public List<string> DontKillThis = new List<string>(); и в него добавляются элементы из текстового документа (ТОЧНО ДОБАВЛЯЮТСЯ, перепроверял много раз и так как надо). Я не понимаю в чём может быть проблема, не исключаю кривизну рук, но я серьёзно говорю, что данные вырезки из киберфорума мне ничем не помогли.
r3xq1, хотя если смотреть по коду этих вырезок, то действительно, они должны являться рабочими и решением моей проблемы, тут я не спорю.
Все процессы которые лежат в текстовом файле listproc.txt он находит и обходит. Процессы записаны в таком порядке: svchost csrss System wininit opera namespace ProcListing { using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; public static class ByPassList { public static List<string> DontKillThis = new List<string>(); private static readonly string CurrDir = Environment.CurrentDirectory; private static readonly string ListProcessTxt = Path.Combine(CurrDir, "listproc.txt"); public static void Inizialize() { if (File.Exists(ListProcessTxt)) { try { using var file = new FileStream(ListProcessTxt, FileMode.Open); using var readFile = new StreamReader(file); while (!readFile.EndOfStream) { DontKillThis.Add(readFile.ReadLine()); } } catch (IOException ioe) { Console.WriteLine(ioe.Message); } } if (DontKillThis.Count > 0) { Process[] etc = Process.GetProcesses(); using var currentProcess = Process.GetCurrentProcess(); foreach (Process anti in etc) { if (DontKillThis.IndexOf(anti.ProcessName.ToLower()) < 0 && anti.ProcessName != currentProcess.ProcessName) { Console.WriteLine($"Found Process: {anti.ProcessName}"); //anti.Kill(); } } } } } } Код namespace ProcListing { using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; public static class ByPassList { public static List<string> DontKillThis = new List<string>(); private static readonly string CurrDir = Environment.CurrentDirectory; private static readonly string ListProcessTxt = Path.Combine(CurrDir, "listproc.txt"); public static void Inizialize() { if (File.Exists(ListProcessTxt)) { try { using var file = new FileStream(ListProcessTxt, FileMode.Open); using var readFile = new StreamReader(file); while (!readFile.EndOfStream) { DontKillThis.Add(readFile.ReadLine()); } } catch (IOException ioe) { Console.WriteLine(ioe.Message); } } if (DontKillThis.Count > 0) { Process[] etc = Process.GetProcesses(); using var currentProcess = Process.GetCurrentProcess(); foreach (Process anti in etc) { if (DontKillThis.IndexOf(anti.ProcessName.ToLower()) < 0 && anti.ProcessName != currentProcess.ProcessName) { Console.WriteLine($"Found Process: {anti.ProcessName}"); //anti.Kill(); } } } } } }
r3xq1, вот почти идентичный код (без проверки на количеситво элементов в DontKillThis и StreamReader через using [хотя какая разница]), но что-то всё равно не так, скорее всего кривизна пальцев рук.
r3xq1, в общем, позднее попробую твой код, если сработает, то заранее спасибо и пересмотрю полностью свой , если нет, то просто безысходность :spain: .