Kopiowanie plików i problem z jego zajętością

0

Cześć, używam NAudio. Mam plik dźwiękowy. Chcę wyciąć jego fragment. Robię to w następujący sposób:

  1. Kopiuję część pliku przed wycięciem do nowego streama
  2. Kopiuję część pliku po wycięciu dalej do nowego streama(z punktu 1)
  3. Zapisuję
  4. Zamykam dwa streamy(oryginalny i nowy)
  5. Kopiję nowy plik w miejsce starego
  6. Usuwam plik tymczasowy(który został skopiowany w punkcie 5).

Za pierwszym razem działa ok. Jednak, jak chcę wyciąć drugi fragment w tym samym pliku, dostaję błąd, że:
"is being used by another process." - odnosi się do pliku oryginalnego - błąd podczas kopiowania. Mój kod:

public void CutSelection(string fileName)
{
//pobieram czas początku i końca zaznaczenia
            TimeSpan startTime = GetSelectionStartTime();
            TimeSpan endTime = GetSelectionEndTime();

//zamieniam te czasy na odpowiednie bajty - pozycja
            int bytesPerMilisecond = waveStream.WaveFormat.AverageBytesPerSecond / 1000;
            int startPos = (int)startTime.TotalMilliseconds * bytesPerMilisecond;
            startPos = startPos - startPos % waveStream.WaveFormat.BlockAlign;

            int endPos = (int)endTime.TotalMilliseconds * bytesPerMilisecond;
            endPos = endPos - endPos % waveStream.WaveFormat.BlockAlign;

//tworzę sobie nowy plik o nazwie kończącej się "_"
            using (WaveFileWriter writer = new WaveFileWriter(fileName+"_", waveStream.WaveFormat))
            {
                byte[] buffer = new byte[1024];
                int bytesRead = 0;
                int bytesRequired = 0;

                //przed
                waveStream.Position = 0;
                while (waveStream.Position < startPos)
                {
                    bytesRequired = (int)(startPos - waveStream.Position);
                    if (bytesRequired > 1024)
                        bytesRequired = 1024;

                    bytesRead = waveStream.Read(buffer, 0, bytesRequired);
                    writer.Write(buffer, 0, bytesRead);
                }

                //po
                waveStream.Position = endPos;
                while (waveStream.Position < waveStream.Length)
                {
                    bytesRequired = (int)(waveStream.Length - waveStream.Position);
                    if (bytesRequired > 1024)
                        bytesRequired = 1024;

                    bytesRead = waveStream.Read(buffer, 0, bytesRequired);
                    writer.Write(buffer, 0, bytesRead);
                }
            }//using

//zamykam oryginalny plik(fileName)
            waveStream.Close();
            waveStream.Dispose();
            waveStream = null;

//kopiuję nowy plik w miejsce oryginalnego - tu mam błąd przy drugim razie. Błąd dotyczy fileName - czyli oryginalnego pliku
            File.Copy(fileName + "_", fileName, true);
            
//usuwam plik tymczasowy            
            File.Delete(fileName + "_");

//tworzę główny waveStream z nowego pliku
            waveStream = new WaveFileReader(fileName);
}

Ten błąd jest dla mnie niepojęty. Dlaczego wyskakuje, skoro zwalniam cały waveStream?

0

nigdzie nie widzę abyś zamykał WaveFileWriter writer

0

Jest umieszczony w using, poza tym czepia się oryginalnego pliku, a więc tego w waveStream.

1 użytkowników online, w tym zalogowanych: 0, gości: 1