C # не может удалить файл, потому что он используется - PullRequest
0 голосов
/ 26 ноября 2018

В настоящее время я пытаюсь сделать трекер работы в C #, и я хочу иметь его там, где он временно создает файл, который сохраняет снимки экрана с действиями на экране, затем преобразует эти снимки экрана в видео, а затем удаляет всескриншоты.Пока все работает, кроме последней части, где я удаляю скриншоты, потому что там написано, что они используются программой.Я не уверен, где ошибка, поэтому я просто дам весь код, который у меня есть:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
using Accord.Video.FFMPEG;
using System.IO;

namespace WorkTracker
{
    public partial class Form1 : Form
    {
        //Vars:
        string outputPath = "";
        string path = "";
        int fileCount = 1;
        List<string> inputImageSequence = new List<string>();

        //Functions:
        void takeScreenshot()
        {
            Rectangle bounds = Screen.FromControl(this).Bounds;
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                }
                string name = path + "//screenshot-" + fileCount + ".jpeg";
                bitmap.Save(name, ImageFormat.Jpeg);
                inputImageSequence.Add(name);
                fileCount++;
            }
        }

        public static void DeletePath(string target_dir)
        {
            string[] files = Directory.GetFiles(target_dir);
            string[] dirs = Directory.GetDirectories(target_dir);

            foreach (string file in files)
            {
                File.SetAttributes(file, FileAttributes.Normal);
                File.Delete(file);
            }

            foreach (string dir in dirs)
            {
                DeletePath(dir);
            }

            Directory.Delete(target_dir, false);
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            tmrTrack.Start();
        }

        private void tmrTrack_Tick(object sender, EventArgs e)
        {
            takeScreenshot();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            tmrTrack.Stop();
            int width = 1920;
            int height = 1080;
            var framRate = 5;

            using (var vFWriter = new VideoFileWriter())
            {
                //Create new video file:
                vFWriter.Open(outputPath+"//video.avi", width, height, framRate, VideoCodec.Raw);

                foreach (var imageLocation in inputImageSequence)
                {
                    Bitmap imageFrame = System.Drawing.Image.FromFile(imageLocation) as Bitmap;
                    vFWriter.WriteVideoFrame(imageFrame);
                    break;
                }
                vFWriter.Close();
            }
            DeletePath(path);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
            folderBrowser.Description = "Select an Output Folder";

            if (folderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                outputPath = @folderBrowser.SelectedPath;
            }
            else
            {
                MessageBox.Show("Please select an output folder.", "Error");
                Form1_Load(sender, e);
            }

            string pathName = "C://Documents//tempScreenCaps";
            System.IO.Directory.CreateDirectory(pathName);
            path = pathName;
        }

        private void btnPause_Click(object sender, EventArgs e)
        {
            tmrTrack.Stop();
        }
    }
}

Любая помощь приветствуется.

...