Ошибка "Процесс не может получить доступ к файлу C#

420
10 июля 2017, 14:47

Друзья, Нужна помощь в решении одной задачи. Есть исходник небольшой программки, который записывает звук с микрофона и сохраняет в wav файл. Так вот при первом запуске программы все работает нормаль, но если после сохранения снова начать запись, то выскакивает ошибка "Процесс не может получить доступ к файлу так как файл занят другим процессом"

Вот сам код:

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.Runtime.InteropServices; // отвечающая за 
using NAudio.Wave;
using NAudio.FileFormats;
using NAudio.CoreAudioApi;
using NAudio;
namespace AutoCliper
{
    public partial class Form1 : Form
    {
        public static Bitmap BM = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
        string FileName = String.Format(@"{0}.wav", System.Guid.NewGuid());
        // WaveIn - поток для записи 
        WaveIn waveIn;
        //Класс для записи в файл 
        WaveFileWriter writer;
        //Имя файла для записи 

        public Form1()
        {
            InitializeComponent();
        }
        //Дата в названии 

        //Получение данных из входного буфера 
        void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new EventHandler<WaveInEventArgs>(waveIn_DataAvailable), sender, e);
            }
            else
            {
                //Записываем данные из буфера в файл 
                writer.Write(e.Buffer, 0, e.BytesRecorded);
            }
        }
        //Завершаем запись 
        void StopRecording()
        {
            MessageBox.Show("StopRecording");
            waveIn.StopRecording();
        }
        //Окончание записи 
        private void waveIn_RecordingStopped(object sender, EventArgs e)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new EventHandler(waveIn_RecordingStopped), sender, e);
            }
            else
            {
                waveIn.Dispose();
                waveIn = null;
                writer.Close();
                writer = null;
            }
        }
        //Начинаем запись - обработчик нажатия кнопки 
        private void button8_Click(object sender, EventArgs e)
        {
            try
            {
                waveIn = new WaveIn();
                //Дефолтное устройство для записи (если оно имеется) 
                //встроенный микрофон ноутбука имеет номер 0 
                waveIn.DeviceNumber = 0;
                //Прикрепляем к событию DataAvailable обработчик, возникающий при наличии записываемых данных 
                waveIn.DataAvailable += waveIn_DataAvailable;
                //Прикрепляем обработчик завершения записи 
                waveIn.RecordingStopped += WaveIn_RecordingStopped;
                ;
                //Формат wav-файла - принимает параметры - частоту дискретизации и количество каналов(здесь mono) 
                waveIn.WaveFormat = new WaveFormat(8000, 1);
                //Инициализируем объект WaveFileWriter 
                writer = new WaveFileWriter(FileName, waveIn.WaveFormat);
                //Начало записи 
                waveIn.StartRecording();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void WaveIn_RecordingStopped(object sender, StoppedEventArgs e)
        {
            //throw new NotImplementedException(); 
        }
        private void button9_Click_1(object sender, EventArgs e)
        {
            if (waveIn != null)
            {
                StopRecording();
            }
        }
    }
}
Answer 1

Данный вариант реализации диктофона будет работать...

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 NAudio.Wave;
namespace AutoCliper
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        WaveIn waveIn;
        WaveFileWriter waveWriter;
        private void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveWriter == null) return;
            waveWriter.Write(e.Buffer, 0, e.BytesRecorded);
            waveWriter.Flush();
        }
        private void button8_Click(object sender, EventArgs e)
        {
            waveIn = new WaveIn();
            waveIn.DeviceNumber = 0;
            string outputFilename = String.Format(@"{0}.wav", System.Guid.NewGuid());
            waveIn.WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(waveIn.DeviceNumber).Channels);
            waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveIn_DataAvailable);
            waveWriter = new WaveFileWriter(outputFilename, waveIn.WaveFormat);
            waveIn.StartRecording();
        }
        private void button9_Click_1(object sender, EventArgs e)
        {
            if (waveIn != null)
            {
                waveIn.StopRecording();
                waveIn.Dispose();
                waveIn = null;
            }
            if (waveWriter != null)
            {
                waveWriter.Dispose();
                waveWriter = null;
            }
            MessageBox.Show("StopRecording");
        }
    }
}
READ ALSO
Можно ли делать проверку через new DirectoryInfo(Path).Exists?

Можно ли делать проверку через new DirectoryInfo(Path).Exists?

Можно ли использовать данный метод для проверки существования папки?

300
работа с Enum в С #

работа с Enum в С #

Проблема с пониманием Enum — не могу разобраться, как искать в зубчатом массиве и как сравнивать в зубчатом массиве данные, применяя EnumЕсли...

309
Можно ли получить имя процесса текущего активного окна?

Можно ли получить имя процесса текущего активного окна?

Я хочу написать для себя простенький сервис для отслеживания того, с какими программами я работаю в течении дня и сколько времени на них трачу

326
C# Изменить содержимое тега textarea

C# Изменить содержимое тега textarea

(C#) Собственно пользуюсь WebBrowser в WindowsFormСпокойно заполнял данные форм на странице пока не дошел до этого:

267