Удалить файл после завершения процесса.C # оконные формы - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть приложение Windows Forms, которое использует временный файл во время работы приложения и удаляет его после закрытия основной формы.Дело в том, что если я закрою программу из диспетчера задач, убив процесс, файл не будет удален.

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

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

другое решение (очень простое для понимания) - использовать помощника, который прерывает, если ваш процесс существует, я использую это решение во многих моих программах для контроля (я не автор идеи, не помню, где у меня есть)нашел эту идею, я только что адаптировал код): вы можете удалить временный файл в завершенном событии.

    static void Main(string[] args)
    {
        //Main App Process.
        if (args.Length == 0)
        {
            //Saves current process info to pass on command line.
            main = Process.GetCurrentProcess();
            mainProcessID = main.Id;

            //Initializes the helper process
            checker = new Process();
            checker.StartInfo.FileName = main.MainModule.FileName;
            checker.StartInfo.Arguments = mainProcessID.ToString();

            checker.EnableRaisingEvents = true;
            checker.Exited += new EventHandler(checker_Exited);

            //Launch the helper process.
            checker.Start();

            Application.Run(new MainForm()); // your winform app
        }
        else //On the helper Process
        {
            main = Process.GetProcessById(int.Parse(args[0]));

            main.EnableRaisingEvents = true;
            main.Exited += new EventHandler(main_Exited);

            while (!main.HasExited)
            {
                Thread.Sleep(1000); //Wait 1 second. 
            }

            //Provide some time to process the main_Exited event. 
            Thread.Sleep(2000);
        }
    }

    //Double checks the user not closing the checker process.
    static void checker_Exited(object sender, EventArgs e)
    {           
        //This only checks for the task manager process running. 
        //It does not make sure that the app has been closed by it. But close enough.
        //If you can think of a better way please let me know.
        if (Process.GetProcessesByName("taskmgr").Length != 0)
        {
            MessageBox.Show("Task Manager killed helper process.");

            //If you like you could kill the main app here to. 
            //main.Kill();
        }
    }

    //Only gets to run on the checker process. The other one should be dead. 
    static void main_Exited(object sender, EventArgs e)
    {
        //This only checks for the task manager process running. 
        //It does not make sure that the app has been closed by it. But close enough.
        //If you can think of a better way please let me know.

        if (Process.GetProcessesByName("taskmgr").Length != 0)
        {
            MessageBox.Show("Task Manager killed my application.");
        }
    }

должен быть лучший способ проверить уничтожение, возможно, перехватить сообщение наДиспетчер задач или подключение к диспетчеру задач.Но решение становится все более сложным

0 голосов
/ 13 декабря 2018

Вы можете использовать FileOptions.DeleteOnClose, как описано в документации к FileOptions Enum для этого случая использования.

В документации указано DeleteOnClose :

Указывает, что файл автоматически удаляется, когда он больше не используется.

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