Laden...

Programm zum Verkleinern von Bildern stürzt immer wieder ab

Erstellt von Thismalor vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.087 Views
T
Thismalor Themenstarter:in
1 Beiträge seit 2018
vor 5 Jahren
Programm zum Verkleinern von Bildern stürzt immer wieder ab

Morgen Freunde

Ersteinmal Vorweg:
Ich bin blutiger Anfänger. Also Quasi 0,0 Ahnung von Programmieren. Aber nicht vergessen. Jeder hat einmal klein angefangen..

Ich hab mit meinem Ersten Projekt ein kleinen Programm geschrieben welches Bilder verkleinert.
Funktioniert soweit auch. Leider stürzt es aber immer wieder ab.

Ich glaube auch das es wirklich schlampig Programmiert ist. Aber wie gesagt ich bin noch blutiger anfänger. Kann mir jemand sagen wie ich das Abstürzen verhindern kann. Ich glaube das Programm stürzt ab sobald schon in den Ordner "Original" schon zugegriffen wird.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace JKThumbnail
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> Bilder = new List<string>();
            List<string> Thumb = new List<string>();
            var PfadBilder = "C:\\wifi\\original";
            var PfadThumb = "C:\\wifi\\Thumbs";

            while (!false && true)
            {

                System.IO.DirectoryInfo ParentDirectory = new System.IO.DirectoryInfo(@PfadBilder);

                foreach (System.IO.FileInfo f in ParentDirectory.GetFiles())
                {
                    Bilder.Add(f.Name);
                    // Console.WriteLine(f.Name);
                }

                var Thump = new List<string>();
                System.IO.DirectoryInfo ThumbDirectory = new System.IO.DirectoryInfo(@PfadThumb);

                foreach (System.IO.FileInfo T in ThumbDirectory.GetFiles())
                {
                    Thumb.Add(T.Name);
                }

                IEnumerable<string> differenceQuery =
                Bilder.Except(Thumb);

                foreach (string s in differenceQuery)
                {
                    string input = PfadBilder + "\\" + s;
                    string output = PfadThumb + "\\" + s;


                    System.Threading.Thread.Sleep(1000);
                    
                    Bitmap thumbnail = new Bitmap(input);

                    Bitmap objBitmap = new Bitmap(thumbnail, new Size(450, 300));

                    // Save thumbnail.
                    objBitmap.Save(output);
                    objBitmap.Dispose();
                    thumbnail.Dispose();
                }
                Bilder.Clear();
                Thumb.Clear();
                System.Threading.Thread.Sleep(5000);
               

            }
        }

            
        }

 }
1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

auch wenn es für Anfänger manchmal etwas harsch hier wird - hier werden gewisse Grundkenntnisse bzw. zumindest Fleiß erwartet - trotzdem wollen wir helfen 😉

Erster Hinweis:
Den Code kann hier so fast keiner lesen - dafür gibt's beim Verfassen des Beitrags extra C#-Tags, damit es wenigst leserlich formatiert wird. Ohne - kannst du Hilfe meist nicht erwarten.

Zweiter Hinweis:
Wenn es zu Laufzeitfehlern wie dem deinen kommt und du eine geeignete Entwicklungsumgebung nutzt (z.B. Visual Studio Express) - stürzt nicht nur dein Programm ab - es wird eine sogenannte Exception geworfen, welche eine genaue Fehlermeldung samt Stacktrace (ausgeführte Methoden), und meist die auslösende Zeile im Code nennen. Den Inhalt der Exception muss man im Forum in den Error-Tags posten. (Deine Umgebung nachstellen und dein Projekt nachstellen ist mitunter aufwändig falls überhaupt möglich - und ohne kann man meist gar nicht helfen)

Dritter Hinweis:
Thread.Sleep ist ähnlich wie Application.DoEvents eine ziemlich ungeschickte Sache. Je nach Ziel gibt es dafür in den allermeisten Fällen eine deutlich bessere Lösung.

Vierter Hinweis:
An Stelle von Dispose solltest du hier "using" (siehe https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/keywords/using-statement) verwenden. Das erspart dir weitere Probleme beim unsauberen Handling.

Zu deinem eigentlichen Problem:
Die Art, in der du das Bild öffnest - ermöglicht Schreibzugriff und versucht demnach die Datei zu sperren - ist diese schon geöffnet - "knallt" es (-> Exception).

Möglichkeiten wieso es bei deinem Code knallt gibt es allerdings sehr viele - deshalb musst du die Exception posten....

LG

Nachtrag als Hilfe (hab den Artikel erst jetzt wieder gefunden) - damit kann man sich meist selbst helfen:
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

286 Beiträge seit 2011
vor 5 Jahren

Zu dem was Taipi schon richtig gesagt hat muss ich ergänzen:

Ich hab mit meinem Ersten Projekt ein kleinen Programm geschrieben

Sorry but: doubt it. Der gepostete Code sieht leider sehr nach zusammengecopypasted aus. So lernst du aber relativ wenig über C# und wie du damit umzugehen hast, da sich idR nicht erschließt wofür z.B. Dispose() eigentlich aufgerufen wird.

Ich würde dir daher das hier empfehlen: [FAQ] Wie finde ich den Einstieg in C#?

Beste Grüße
emuuu

Und leicht OT:


while (!false && true)
{}

What the hell?
Mit ! negierst du einen boolschen Wert also !false = true. bzw. !true = false. Sprich deine Klammer heißt einfach nur (true && true). Zumal while(true) für eine endlos-Schleife okay sein kann, in der Regel aber nicht die bestmögliche Lösung ist, meist sogar eine ziemlich miese, da die Wahrscheinlichkeit, dass dein Programm einfach einfriert (da Endlos-Schleife in der UI) recht hoch ist.

2+2=5( (für extrem große Werte von 2)

M
368 Beiträge seit 2006
vor 5 Jahren

Kurzer Nachbau des geposteten Quellcodes mit VS 2017 Community (und anderen Ordnernamen mit Testbildern in "original"): das Programm kompiliert einwandfrei, zeigt ein Konsolenfenster, komprimiert die Bilder einwandfrei in den Ordner "thumbs", wirft aber gerade keine Exception...

Was die programmiererische Umsetzung angeht, könnte man DotNetPerls - Recursive File List und DotNetPerls - Image zumindest mal ansehen (nicht zum blinden Kopieren gedacht)

Nachtrag: die Zeile mit "while (!false && true)" könnte/sollte man mit "try" ersetzen
(am Ende dann


catch(Exception ex)
            { Console.WriteLine(ex);  }

nicht vergessen). Das Konsolenfenster schliesst sich dann regulär.

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉