System.IO.FileStream: Prozess kann nicht auf Datei zugreifen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    System.IO.FileStream: Prozess kann nicht auf Datei zugreifen

    Hallo,

    ich hab ein kleines Problem mit System.IO.FileStream.

    Die Prozedur nimmt einen Radiostream auf Festplatte auf. Bei der ersten Aufnahme klappt alles, aber wenn ich erneut einen Sender aufnehmen will, kommt der Fehler:

    System.ObjectDisposedException: Auf eine geschlossene Datei kann nicht zugegriffen werden.

    Der Code sieht so aus:

    VB.NET-Quellcode

    1. Public fs As System.IO.FileStream = Nothing
    2. Private Sub MeinDownload(ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr)
    3. If fs Is Nothing Then
    4. ' Datei erzeugen
    5. Datum = CStr(DateTime.Now)
    6. Titelname = Datum
    7. Datum = Replace(Datum, ":", ".")
    8. If System.IO.Directory.Exists(MP3Pfad & "\Aufgenommene Radiostreams") = False Then
    9. System.IO.Directory.CreateDirectory(MP3Pfad & "\Aufgenommene Radiostreams")
    10. End If
    11. fs = File.OpenWrite(MP3Pfad & "\Aufgenommene Radiostreams\" & SenderRecorded & " - " & Datum & ".mp3") 'Pfad der Musikdatenbank noch speichern in database-------------------
    12. End If
    13. If buffer = IntPtr.Zero Then
    14. ' Download fertig
    15. fs.Flush()
    16. fs.Close()
    17. Else
    18. ' Größe des Buffers anpassen
    19. If Streamdaten Is Nothing OrElse Streamdaten.Length < length Then
    20. Streamdaten = New Byte(length) {}
    21. End If
    22. ' Speicher in Buffer kopieren
    23. System.Runtime.InteropServices.Marshal.Copy(buffer, Streamdaten, 0, length)
    24. ' In Datei schreiben
    25. fs.Write(Streamdaten, 0, length)
    26. End If
    27. 'fs = Nothing
    28. End Sub


    Also hab ich unten das hier auskommentierte fs = Nothing eingefügt.

    Nur dann kommt es schon ebim ersten Mal aufnehmen zum Fehler in Zeile 10:

    System.IO.IOException: Der Prozess kann nicht auf die Datei "C:\Aufgenommene Radiostreams\DasDing - 20.04.2021 14.57.47.mp3" zugreifen, da sie von einem anderen Prozess verwendet wird.

    Kann mir jemand sagen was ich da falsch mache?
    @kafffee Die Variable fs hat außerhalb der Prozedur nix zu suchen!
    Pack sie in einen Using-Block und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Falls das ums DOWNLOADPROC der bass.dll geht, hat die variable fs imo nichts in der void zu suchen, zumindest nicht die initialisierung. Denn diese void wird recht oft gecallt, also immer die Datei öffnen und schliessen ist nicht so fein.

    Eine void StartRecording wo der Filestream initialisiert wird(= new filestream @kafffee!), in der callback void auffe Platte schreiben, eine void StopRecording zum stoppen der Aufnahmem wie auch aufräumen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Takafusa“ ()

    Ach sorry, void ist gleich sub, nutze kaum noch VB, fast nur noch C-Syntax Sprachen, daher schrieb ich dies irgendwie automatisch. Callback daher weil die BASS die function "zurückruft", also einen "call" ausführt, callback, rückruf.

    Sonst wie gesagt, eine Sub zum initialisieren des FileStreams(= new FileStream), ein flag setzen(rekording = true), im callback "MeinDownload" flag checken, wenn rekording true und fs nicht gleich null, auf platte schreiben. Eine Sub zum beenden, flag auf false, fs schliessen und disposen.
    @RodFromGermany

    Ich hab bis jetzt null Erfahrung weder mit Using noch mit System.IO.FileStream.

    Hab jetzt mal die bestehende Deklaration Public fs As SYstem.IO.FileStream = Nothing rausgenommen und angefangen mit:

    Using fs As New System.IO.FileStream()

    Da will er als Argumente handle As IntPtr und acces As FileAccess haben.

    Kannst du mir vielleicht ein kleines Beispiel schreiben? In den Microsoft Docs steht dass die beiden veraltet sind...
    Wenn du innerhalb der Callback void den FileStream erstellst und schliesst, passiert das sicher hunderte male pro Lied. In diesem Fall ist eine Variable im Scope der Klasse Sinnvoll.

    Edit @kafffee
    Gugge mal: (Kann mich nur wiederhohlen, die Instanziierung des FileStream finde ich nicht gut im Callback, passiert zu oft.) Wobei man den bool weglassen könnte.

    C#-Quellcode

    1. FileStream fs = null;
    2. bool recording = false;
    3. void StartRecording(string filename)
    4. {
    5. if(fs != null)
    6. {
    7. fs.Close();
    8. fs.Dispose();
    9. }
    10. fs = new FileStream(filename, FileMode.CreateNew);
    11. recording = true;
    12. }
    13. void StopRecording()
    14. {
    15. recording = false;
    16. if (fs != null)
    17. {
    18. fs.Close();
    19. fs.Dispose();
    20. }
    21. }
    22. void MeinDownload(IntPtr buffer, int length, IntPtr user)
    23. {
    24. if(fs != null && recording)
    25. {
    26. //auffe platte schreiben
    27. }
    28. }

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Takafusa“ ()

    @kafffee So etwa:

    VB.NET-Quellcode

    1. Private Sub MeinDownload(ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr)
    2. ' Datei erzeugen
    3. Dim Datum = CStr(DateTime.Now)
    4. Dim Titelname = Datum
    5. Datum = Replace(Datum, ":", ".")
    6. If System.IO.Directory.Exists(MP3Pfad & "\Aufgenommene Radiostreams") = False Then
    7. System.IO.Directory.CreateDirectory(MP3Pfad & "\Aufgenommene Radiostreams")
    8. End If
    9. Using fs = File.OpenWrite(MP3Pfad & "\Aufgenommene Radiostreams\" & SenderRecorded & " - " & Datum & ".mp3") 'Pfad der Musikdatenbank noch speichern in database-------------------
    10. If Streamdaten Is Nothing OrElse Streamdaten.Length < length Then
    11. Streamdaten = New Byte(length) {}
    12. End If
    13. ' Speicher in Buffer kopieren
    14. System.Runtime.InteropServices.Marshal.Copy(buffer, Streamdaten, 0, length)
    15. ' In Datei schreiben
    16. fs.Write(Streamdaten, 0, length)
    17. End Using
    18. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    kafffee schrieb:

    Zeile 1 in Visual Basic übersetzen
    Das solltest Du selbst können:

    C#-Quellcode

    1. FileStream fs = null;

    C#-Quellcode

    1. Private fs As FileStream = Nothing

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!