Запишите все процессы в текстовый файл - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь записать все процессы в текстовый файл, но он запишет только первый процесс в моей системе. Не могли бы вы, ребята, посмотреть, есть ли что-нибудь не так или что я могу исправить, чтобы исправить эту проблему?

private void button5_Click(object sender, EventArgs e)
        
    {
        try
        {
            var ap = Process.GetProcesses();
            SaveFileDialog sfdv2 = new SaveFileDialog();
            if(sfdv2.ShowDialog() == DialogResult.OK)
            {
                foreach(Process process in ap)
                {
                    string path = sfdv2.FileName;
                    BinaryWriter bw2 = new BinaryWriter(File.Create(path));
                    bw2.Write("test" + " "  + ap.ToString());
                    bw2.Dispose();
                }
                
                
            }
           
        }
        catch(Exception ex) { MessageBox.Show(ex.Message); }
    }

Ответы [ 3 ]

3 голосов
/ 11 июля 2020

Сделайте шаг назад и посмотрите, что вы пишете.

Для каждого процесса в списке вы создаете файл с тем же именем (и перезаписываете предыдущий) и пишете "test {process}" в нем.

Код делает то, что вы ему говорите, и поэтому в конечном итоге вы получаете только один процесс в файле.

Вы можете исправить это, открыв файл за пределами l oop и закрывая его после этого, или, что еще лучше, вы можете написать его с помощью оператора using. Также не используйте BinaryWriter для записи в текстовый файл. Есть много других методов, и предлагаемый - StreamWriter. Взгляните на эту страницу документации , чтобы увидеть несколько примеров.

string path = sfdv2.FileName;
// with using, the file will be also closed when it's disposed.
using (var file = new System.IO.StreamWriter(path))
{
  foreach(Process process in ap)
  {
      file.WriteLine("test " + ap.ToString());
  }
}
1 голос
/ 11 июля 2020

Попробуйте разделить исходную проблему на более мелкие и простые задачи:

Строки, которые мы хотим записать:

var linesToWrite = Process
  .GetProcesses()
  .Select(process => $"test {process.ProcessName}");

UI:

using (SaveFileDialog dialog = new SaveFileDialog() {
    //TODO: here we put dialog's parameters
  }) {

  if (dialog.ShowDialog() == DialogResult.OK) {
    //TODO: here we put the main routine 
  }
}

Объединение всего вместе:

private void button5_Click(object sender, EventArgs e) {
  using (SaveFileDialog dialog = new SaveFileDialog() {
      //TODO: here we put dialog's parameters
    }) {

    if (dialog.ShowDialog() == DialogResult.OK) {
      File.WriteAllLines(dialog.FileName, Process
       .GetProcesses()
       .Select(process => $"test {process.ProcessName}")); 
    }
  }
}
1 голос
/ 11 июля 2020

Вы можете sh рассмотреть возможность использования Asyn c версии обработчика событий нажатия кнопки. Это связано с тем, что запись в файлы - потенциально длительный процесс. Так что вы можете запустить его, а не ждать, чтобы заблокировать свой интерфейс. Объедините это с методами StreamWriter.WriteAsyn c и используйте вместе с await. например,

   private async void button5_Click(object sender, EventArgs e)
    {
     try
       {
           var ap = Process.GetProcesses();
           SaveFileDialog sfdv2 = new SaveFileDialog();
           if(sfdv2.ShowDialog() == DialogResult.OK)
           { 
               string path = sfdv2.FileName;
               using(StreamWriter bw2 = new StreamWriter(File.Create(path)))
               {
                  foreach(Process process in ap)
                  {
                      await bw2.WriteAsync("test" + " "  + process.ProcessName.ToString());
                  }
               }
           }           
       }
       catch(Exception ex) { MessageBox.Show(ex.Message); }
    }
 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...