(WPF) Datei kann nicht beschrieben werden, obwohl sie nicht verwendet wird..

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    (WPF) Datei kann nicht beschrieben werden, obwohl sie nicht verwendet wird..

    Hallo zusammen,

    in einem WPF-C#-Projekt beschreibe ich eine Datei mit einer BitmapEncoder-Instanz.

    C#-Quellcode

    1. BitmapEncoder enc = new BmpBitmapEncoder();
    2. enc.Frames.Add(BitmapFrame.Create(value));
    3. using (FileStream stream = new FileStream(cpath, FileMode.Create))
    4. {
    5. enc.Save(stream);
    6. }


    Beim ersten Programmstart gibt es keine Probleme beim Erstellen der Datei (Beim ersten Programmstart existiert sie auch nicht)
    Ab dem zweiten Programmstart gibt es aber eine IOException: Die Engine sagt mir, dass die Datei von einem anderen Prozess verwendet wird.

    Was mache ich falsch?

    LG
    Hallo

    Jetzt ohne es probiert zu haben.

    keineahnung schrieb:

    eim ersten Programmstart existiert sie auch nicht


    Du sagst aber im Konstrutor des FileStream mit FileMode.Create das du ein File erstellen willt. Normalerweise kann die Methode ein vorhandenes File überschreiben. Laut Doku ist es aber empfohlen FileMode.Truncate zu verwenden wenn die Datei existiert. Mach also am besten eine überprüfung davor. Evtl. Hilft es.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hab mein Code entsprechend mal geupdatet:

    C#-Quellcode

    1. BitmapEncoder enc = new BmpBitmapEncoder();
    2. enc.Frames.Add(BitmapFrame.Create(value));
    3. FileMode mode = FileMode.Create;
    4. if (File.Exists(cpath)) { mode = FileMode.Truncate; }
    5. using (FileStream stream = new FileStream(cpath, mode))
    6. {
    7. enc.Save(stream);
    8. }​


    Leider ist das Probem immernoch vorhanden.
    Es ist anscheinend so, dass die Datei in meinem eigenen Programm iwie geöffnet ist, obwohl ich das Programm geschlossen habe.
    Und wenn ich das Programm erneut aufrufe, kann das Programm auf diese Datei nicht schreiben (lesen funktioniert aber immernoch).
    Das heißt also: Das ich auch z. B. dann nicht einmal File.Delete(cpath) machen kann, ab dem zweiten Aufruf des Programms.

    Geschlossenen wird der Stream aber auch wegen "using".
    stream.Dispose(), .Flush() und .Close() hab ich auch schon probiert, ohne Erfolg.

    Hast Du oder jmd. anders vlcht noch nen anderen Vorschlag?

    LG und Danke im voraus
    @keineahnung Meine Mono-Image-Speicher-Routine sieht so aus:
    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// Saves the image information as a Png image
    3. /// </summary>
    4. /// <param name="filename">full path to save the image</param>
    5. /// <param name="pixels">pixel information of the image</param>
    6. /// <param name="palette">palette information of the image</param>
    7. /// <param name="info">additional image information</param>
    8. /// <returns>success of saving</returns>
    9. public static bool SavePng(string filename, Array pixels, BitmapPalette palette, PictureInfoWpf info)
    10. {
    11. PixelFormat fmt = (info.PictureTypeWpf == PictureWpf.PictureTypeWpf.Gray8)
    12. ? PixelFormats.Gray8
    13. : PixelFormats.Gray16;
    14. int stride = (info.PictureTypeWpf == PictureWpf.PictureTypeWpf.Gray8) ? info.Width : info.Width * 2;
    15. BitmapSource image = BitmapSource.Create(
    16. info.Width,
    17. info.Height,
    18. 96,
    19. 96,
    20. fmt,
    21. palette, // BitmapPalettes.Gray16,
    22. pixels,
    23. stride);
    24. // Image has to be converted to ARGB Format
    25. FormatConvertedBitmap newImage = new FormatConvertedBitmap(image, PixelFormats.Rgb24, null, 0.0);
    26. using (FileStream stream = new FileStream(filename, FileMode.Create))
    27. {
    28. PngBitmapEncoder encoder = new PngBitmapEncoder();
    29. encoder.Frames.Add(BitmapFrame.Create(newImage));
    30. encoder.Save(stream);
    31. }
    32. return true;
    33. }
    Das funktioniert mit 8 BPP (byte) und 16 BPP (ushort) im Parameter Array pixels.
    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!
    Ich hab jetzt gecheckt woran es wirklich liegt.
    Und zwar lade ich das Bild aus der Datei in ein Image-Control.
    Dabei wird die Datei in meinem Programm geöffnet, warum auch immer.
    Das heißt wenn ich sie wieder beschreiben will, geht es nicht, weil die Datei dessen Bild in meiner Image-Control zuvor geladen wurde.

    Ich hab dagegen auch ne Lösung, indem ich ein BmpBitmapEncoder nehme:

    C#-Quellcode

    1. Uri uri = new Uri(p, UriKind.Absolute);
    2. BmpBitmapDecoder dec = new BmpBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    3. imgC.Source = dec.Frames[0];
    4. UPDATE:
    5. Okay ich habs jetzt auf die nächste Sekunde von selbst gebacken gekiregt. IUch

    p ist der Pfad(String)

    Stichwort ist hier BitmapCacheOption.OnLoad, das ermöglicht, die Datei nach dem Laden des Bilder wieder zu schließen.
    Aber das geht jetzt natürlich nur bei .bmp-Formaten weil Ich nen BmpBitmapEncoder benutze.

    Ich möchte aber:
    Alle möglichen Image-Formate in mein Image-Control laden, OHNE dass die Datei dabei unbeschreibbar wird, bis mein Programm wieder schließt.
    Hat jemand eine Idee wie ich das machen kann?

    Ist auch generell dumm warum das so kompiziert geworden ist, in Windows Forms damals hatte man einfach z. B. Image.Save und der Laub ist weggeblasen..:/






    --- UPDATE ---
    Ich habs jetzt selbst gebacken gekriegt. Und zwar indem ich den Dateiinhalt der Bilddatei in einen MemoryStream lade, auf den ich dann beim Initialisieren des BitmapImages zuugreife. So wird die Datei wieder geschlossen und es werde endlich
    alle Formate unterstützt, ärger mich nur, dass ich früher nicht drauf gekommen bin.
    code sieht jtzt so aus:

    C#-Quellcode

    1. [b][/b]MemoryStream stream = new MemoryStream(File.ReadAllBytes(p));
    2. BitmapImage img = new BitmapImage();
    3. img.BeginInit();
    4. img.StreamSource = stream;
    5. img.EndInit();
    6. imgC.Source = img;


    Trotzdem danke für die reaktionsschnelle Hilfsbereitschaft, wtf wie schnell hier Antworten einfach kommen :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „keineahnung“ ()

    Super das du es geschafft hast du das du der Nachwelt hier die Lösung gepostet hast.

    keineahnung schrieb:

    Ich hab jetzt gecheckt woran es wirklich liegt.
    Und zwar lade ich das Bild aus der Datei in ein Image-Control.

    Schade, die Info hatten wir nicht. Laut deinem Code ging ist davon aus das das File einfach nur gespeichert wird. Und das hätte ja kein Problem darstellen sollen.
    Immer wieder wichtig alle Infos zu bekommen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##