Laden...

Forenbeiträge von Butzi74 Ingesamt 23 Beiträge

28.06.2022 - 09:13 Uhr

Irgendwas ist ja immer🙂 Jetzt habe ich mein kleines, feines Tool soweit fertig und lief auf drei verschiedenen Rechnern auch problemlos. Beim vierten nun bekommt der User die Meldung "Der Computer wurde durch Windows geschützt" und das der SmartScreen meine EXE blockiert da unbekannte App. Er User kann NUR "Nicht ausführen" machen. Kein "Trotzdem ausführen" oder sowas in der Art.

Wie kann ich sowas umgehen? Wahrscheinlich nur mit Kosten in dem ich mir ein Zertifikat oder sowas ausstellen lasse, oder? 😦 Da es ein Just4 Fun Projekt aber ist, fallen Kosten schon mal weg.:-(

28.06.2022 - 08:04 Uhr

Ja, so wirkliches Backup soll es ja nicht sein. Wir tauschen hier im Geschäft alle vier Jahre die Rechner. Egal ob die noch top sind oder nicht. Da zieht also der User von einem Rechner auf den anderen um. Manche machen es selbst was die Daten angeht, andere bekommen es eben nicht hin. Ja, es gibt Leute die sich in manch Programm eben auskennen wie kein anderer, aber in reinen Windowsdingen die vollen Nieten sind. Zwar könnte man nun sagen, sie sollen einfach über ihr Microsoft Konto die Daten online sichern (Synchronisieren per OneDrive) aber mögen viele nicht und zudem werden nicht auch die Favoriten von GoogleChrome sowie manch SAP Einstellungen mit kopiert.

Ich wollte nun einfach (eher aus Spass und um mal C# etwas kennen zu lernen) ein Tool erstellen mit dem der User die Daten selbst "kurz" wegsichert und dann auch wieder "zurück sichert".
Hatte ja schon mal was in der Art gebastelt. Auf CMD Basis. Aber da gibt es eben keine schönen Dialogfenster zum Auswählen von Ordner oder Dateien etc.🙂

Wie auch immer....Muss mir da was mal einfallen lassen. Vielleicht probiere ich noch die Variante, dass beim Sichern gleich alles in eine ZIP gehauen wird und beim zurück sichern die ZIP geöffnet wird und direkte daraus alles raus kopiert wird. Spare ich mir das Extrahieren. Und wer weiß....vielleicht geht dies ja.🙂

27.06.2022 - 15:50 Uhr

Hmm. Ok. Also File in Use fällt schon mal weg da diese nicht in Benutzung sein kann. File Permissions schließe ich auch aus, da ich dies schon mit dem Kopieren zuvor in den Ordner ausschließe. Softlinks und Hardlinks weiß ich nun nicht genau was du damit gerade meinst:-(

Tja, schade eigentlich. Wollte gerne, dass die Daten welcher der User sichert danach in eine ZIP gepackt wird und mit einem Kennwort verschlüsselt sind. Und nur der User kann kann dann mit diesem Tool auch ein Rücksichern machen. Also die Zip Datei extrahieren und die Daten zurückkopieren lassen. Ging/geht auch prima ...Aber wehe eine komische Datei ist dabei...dann bricht mir das extrahieren ab:-(

27.06.2022 - 15:22 Uhr

Also, ich habe nun das ganze mir genauer angeschaut wann er abbricht. Es bricht mir immer mit der Fehlermeldung "Illegales Zeichen im Pfad" ab. Dabei handelt es sich um irgendwelche Favoriten Lesezeichen im Ordner "Favoriten". Da das Tool ja jedem User die Möglichkeit geben soll, seine Daten wie Desktop, Dokumente, Downloads etc. zu sichern, kann ich nicht um voraus bestimmte Dateien/Verknüpfungen einfach ausschließen.

Was mich eben wundert: Egal ob mit WinZip, 7Zip oder mit dem int. Zip Funktion von Windows: Ich kann problemlos die Zip Datei komplett extrahieren. Wieso kann dies aber nicht DotNetZip oder das int. Zip von C# etc.??

24.06.2022 - 14:02 Uhr

Ok, als totaler Neuanfänger in C# (nie gelernt etc.) weiß ich nun nicht was du von mir brauchst? 🙂

Also mit


System.IO.Compression.ZipFile.ExtractToDirectory(Dateiname, Extraxcttemp);


lass ich die Datei extrahieren. Dateiname = die Zipdatei und Extrattemp = das Verzeichnis wo es hin extrahiert werden soll.

24.06.2022 - 13:49 Uhr

Danke für eure ganzen Antworten. Musste leider alles wieder zurück bauen 😦
Aber nur weil das extrahieren nicht klappt. Egal ob mit der DLL von Drittanbieter (verschiedene probiert) oder mit den internen Tool (System.IO.Compression), es bricht immer mitten drin beim extrahieren ab.

Extrahiere ich die ZIP Datei manuell mit z.b. 7-Zip funktioniert es prima. Also komprimieren geht aus meinem Programm heraus. Und da ich die ZIP Datei mit 7Zip normal öffnen kann, scheint dort auch nicht das Problem zu liegen. Entweder bricht es beim extrahieren ab, weil die ZIP-Datei ziemlich gross ist oder keine Ahnung. Als ich es mit einer kleinen Zip-Datei machte, ging es problemlos. Nur bei grösseren bricht es ab.

Als Background: Ich habe ein Tool erstellt mit dem User Ihre Daten sichern können. Dabei wird ein Sicherungsordner erstellt, wo alles reinkopiert wird und dann anschießend dieser in eine ZIP-Datei verpackt wird. Beim zurücksichern wählt der User die ZIP-Datei aus und das Tool soll mir die ZIP Datei unter C:\Users\xxx\appdata\temp\Extrahtsich extrahieren und dann von dort die Daten zurück kopieren. Anschließend löscht er diesen Ordner unter Temp wieder. Am Speicherplatz kann es nicht liegen. Da habe ich genügend. Läuft beim extrahieren evtl. der RAM voll oder was könnte das Problem sein? Jetzt war ich fast fertig und dann so ein blödes Problem. 😦

Wie gesagt, egal ob mit DotNetZip oder anderem Package oder mit dem internen Zip-Funktion....das extrahieren klappt nicht.

23.06.2022 - 12:40 Uhr

Prima.
Habe es nun hinbekommen🙂

Aber nur mit dieser Lösung hier:
http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application

Denn z.b. das ILMerge wird nicht mehr unterstützt und kann bei Microsoft auch nicht mehr heruntergeladen werden.

Danke nochmal.

23.06.2022 - 07:30 Uhr

Ok, dann schaue ich mir das mal mit ILMerge usw. an. Danke schon mal🙂

22.06.2022 - 16:00 Uhr

Verwende .Net Framework 4.6

22.06.2022 - 15:56 Uhr

Also ich bekomme ich es immer noch nicht hin. Muss aber das Tool nun fertig bekommen und lasse es vorerst mal mit dem manuellem Ausblenden der jeweiligen TextBlöcke. Wenn ich wieder Luft habe, setze ich mich da erneut dran und versuche nochmal mein Glück. Wenn es klappt gibt es eine Version 2 quasi von meinem Tool🙂

22.06.2022 - 15:48 Uhr

Hallo zusammen.

Ich habe eine EXE Datei erstellt (nennen wir sie jetzt mal "Programm.exe", die später einfach durch kopieren auf jedem Windows Rechner verwendet werden kann. Eine Art Portable Version quasi. Klappt auch soweit.

Nun habe ich aber eine Zusatzfunktion eingebaut, bei der ich das NutGet Paket "DotNetZip" verwende. Diese DLL kann ich aber nicht fest in meine EXE einbinden, so dass diese nicht mit kopiert werden muss. Versteht ihr wie ich es meine?

Also der Anwender soll weiterhin sich nur die "Programm.EXE" kopieren müssen ohne zusätzlich die DotNetZip.DLL auch mit kopieren zu müssen.

PS: Wie bereits in anderen Threads schon erwähnt: Absoluter C# Anfänger.:-(

14.06.2022 - 10:57 Uhr

Danke für die schnelle Antwort🙂 Muss ich mir , wenn ich mehr Zeit und Ruhe habe, dann mal anschauen.

Aber wenn ich das nun auf den schnelle Blick richtig verstehe/sehe, dann verpasse ich z.b. dem TextBlock keinen festen Namen mit <TextBlock X:Name="DesktopBlock" ..> sondern mit <TextBlock IsEnabled="{Binding DesktopBlock}" /> und dann eben den entsprechenden C-Code wo ich zuvor (Beispiel Desktop) aus ORDNER+"Block" mir den String "DesktopBlock" zusammenbaue?

14.06.2022 - 10:19 Uhr

Hallo zusammen.

Ich kämpfe mal wieder, als blutiger Anfänger, mit etwas herum und fand bisher echt nichts im Internet was mir half. Vielleicht sehe ich das Ganze viel zu falsch und es steckt wirklich viel mehr Arbeit dahinter:-(

Ich habe eine Seite (Page) bei dem es mehrere TextBlöcke gibt. Diese enthalten jeweils eine Prozessbar sowie ein Image. Die TextBlöcke, sowie die Prozessbar und das Image, haben jeweils einen Namen (x:Name=""). Die Namen der TextBlöcke heissen z.B. "DesktopBlock", "DokumenteBlock", "DownloadsBlock" usw. Die Prozessbar heissen "DesktopPG", "DokumentePG", "DownloadsPG" usw. Genauso die Images "DesktopIMG", "DokumenteIMG" usw.

Dann habe ich mir eine Klasse erstellte, die sich "Tools" nennt. Dort habe ich alle Funktionen wie z.b. Kopieren von Ordner usw. reingehauen. Die Kopierfunktion rufe ich dann z:b. über "Tools.Kopier(Quelle, Ziel);" auf. Geht alles.

Nun möchte ich eine weitere Funktion reinpacken, mit dem ich jeweils die Blöcke sowie Prozessbar oder auch Image ein und ausblenden kann.
Dies möchte ich durch z.b. "Tools.Info(Ordner,Zustand);" einblenden oder ausblenden. Sprich, gebe ich den Wert "Desktop" als ORDNER an, wird dieser als String weitergegeben und soll dann der TextBlock "DesktopBlock" angesprochen werden und eingeblendet werden. Mit ON oder OFF spreche ich über den String "Zustand" (On oder Off) dann die Prozessbar "DesktopPG" und "DesktopING" jeweils an.
Die ON oder OFF würde ich mit je einer IF Abfrage dann lösen.

Einen TextBlock blende ich ja mit "TextBlockname.Visibility = Visibility.Hidden;" aus. Korrekt?
Aber wie bekomme ich den String als TextBlocknamen z.b. hin? oder auch als Prozessbarnamen /Imagenamen?:-(
Zuerst erstelle ich neue Variablen wie "var Block = Ordner +"Block" oder "var PG = Ordner + "PG". Würde ja dann "DesktopBlock" ergeben.
Dann müsste es (mal bildlich gesehen) nur noch heissen "Block.Visibility = Visibility.Hidden". Aber VisualStudio kennt natürlich keinen TextBlock mit dem Namen BLOCK.

Hoffe ich konnte nun alles verständlich erklären was mein Problem ist oder wie ich es habe?🙂

PS: Ich verwende WPF und kein WindowsForm!

03.06.2022 - 09:29 Uhr

Das mit dem static ist schon mal geil. Danke für den Tipp. Wieder was dazu gelernt. Rest schaue ich mir morgen oder irgendwann an, wenn ich heute nicht mehr dazu kommen sollte.

PS. Ja, das war mein Fehler den ich meinte,. Hatte das falsche CATCH (xxx) verwendet.:-(

03.06.2022 - 08:51 Uhr

Vergiss es wieder was die Fehlermeldung angeht🙂 Leider kann man seinen Beitrag hier wohl nicht nachträglich zweimal editieren.
Die Fehlermeldung ist weg da ich einen Fehler drin hatte in der Try Catch Methode. Mein Fehler.

Funktioniert wie gewünscht. Super. Vielen vielen Dank.
Als nächstes werde ich mir nun mal diese Path Geschichte dann anschauen sowie wie ich mein Ein und Ausblenden von der Prozessbar etc. besser hinbekomme.
Am liebsten wäre mir ja, dass er bei jedem Kopiervorgang wirklich anzeigt wie weit er schon ist. Also die Prozessbarwerte sich anpasst und wenn 100% geschafft ist, er dann mir den Fertig haken anzeigt. Vielleicht bekomme ich das auch irgendwann mal hin aber wäre mein letzter Schritt um es NOCH BESSER hin zu bekommen.🙂

Somit nochmal schönes Wochenende vorab und echt herzlichen Dank! 🙂

03.06.2022 - 08:11 Uhr

Na, wer hätte das gedacht. Doch schon früher dazu gekommen mir das anzusehen. Allerdings bekomme ich da ein paar Fehler rein bzw. meckert mir Visual Studio:-(

Siehe Anhang Screenshot .

Bei Punkt 1. nehme ich an, da nun drei Stringparameter eigentlich übergeben werden müssen, muss dies so heissen?


 Kopieren(newDirectoryPath, newTargetPath.ToString(),token);

Und bei Punkt 2: muss noch das token. davor. Also so:


token.ThrowIfCancellationRequested();

Zumindest meckert mit Visual Studio dann nicht mehr mit roten Wellenlinien an. Aber... zwar wird meine Funktion nun, wie gewünscht, unterbrochen, aber ich bekomme dann immer eine Fehlermeldung von Visual Studio. "Unbehandelte Ausnahme":-(

Oder liegt es daran, das ich try und Catch in meiner GO Methode falsch gesetzt habe?


Desktopbox.Visibility = Visibility.Visible;
            await Task.Run(() =>
            {
                try { 
                Kopier Desktop = new Kopier();
                Desktop.Kopieren(Quelle + @"\Desktop", pathString + @"\", tokenSource.Token);
                }
                catch (UnauthorizedAccessException)
                {
                    return;
                }

            });
            Desktopkreis.Visibility = Visibility.Hidden;
            Desktophaken.Visibility = Visibility = Visibility;


            Dokumentebox.Visibility = Visibility.Visible;
            await Task.Run(() =>
            {
                try
                {
                Kopier Dokumente = new Kopier();

03.06.2022 - 07:39 Uhr

Guten Morgen.

Vielen vielen Dank. Ich werde es in der nächsten Pause mir anschauen und probieren. Und dann mir auch genau mal ansehen wie das nun funktioniert.
Auch habe ich mir nun deine genannten Punkte mal aufgeschrieben, dass ich mir diese mal anschaue.Damit meine ich das Thema Environment.GetFolderPath.

Auch das mit dem Desktophaken.Visibility = Visibility = Visibility; will ich noch sauberer lösen. Ich habe, damit der User sieht dass überhaupt was passiert, pro Kopiervorgang einen Text (Beispiel "Kopiere nun Ordner Desktop.... :" sowie eine Prozessbar und einen "FERTIG Haken". Während des Kopierens ist der Text und die Prozessbar eingeblendet bzw. wird zu Begin beim Kopieren eingeblendet. Wenn der Kopiervorgang zu Ende ist, wird die Prozessbar ausgeblendet und statt dessen der Fertig Haken eingeblendet. Da war ich auch mal kurz dabei das ganze in eine eigene Funktion zu bauen die ich dann z.b. mit "Kopierinfoonn(Desktop)" oder "Kopierinfofertig(Desktop)" lösen wollte. Doch bei der Übergabe des jeweiligen Namens (hier Beispiel "Desktop") und dann daras den jeweiligen Textboxnamen zu generieren, scheiterte ich.:-( Ich meine damit: Der Name/String DESKTOP wurde zwar an die Funktion übergeben, aber ich konnte daraus dann z.b. nicht "Desktopbox" erstellen und damit dann "Desktopbox.Visibility" erstellen.

Auch habe ich vor, die Kopierfunktion "Class Kopier" in eine extra Klasse zu packen und diese dann aus der Klasse heraus anzusprechen. Am liebsten so, dass meine "Sichern.cs" schon den Befehl "Kopier(Quelle, Ziel)" kennt.

Ja, kleines Projekt aber noch viel vor🙂 Wie gesagt, bin absoluter Neuling und hatte mir das auch alles viel leichter vorgestellt. War schon beim KOpieren der Ordner inkl. Unterordner schockiert was man alles dazu machen/schreiben musste an Code. Bei einer CMD Konsole mache ich eben einfach nur "Xcopy ..... .... /E/D/I/Y" und schon wird der Ordner inkl. Dateien und Unterordner kopiert.

So, jetzt schaue icb mir nachher mal deine Hilfe an. Danke auf jeden Fall nochmal 🙂 Und vorab schönes Wochenende, falls ich doch nicht mehr dazu heute komme.

02.06.2022 - 14:05 Uhr

Hier die XAML Datei dazu.

Wie gesagt...das ist eine PAGE, die ich in ein Frame lade.

02.06.2022 - 14:03 Uhr

Ähmm, ich habe jetzt einfach mal direkt die Seite (wo das ganze Skript drin ist) aus dem Projektordner kopiert.

02.06.2022 - 10:43 Uhr

Ok, ich habe nun ewig herumgemacht und bekomme es einfach nicht hin 😦
Eine freche Frage jetzt mal, aber könnte mir jemand dies als Code zeigen, wie es bei mir aussehen müsste? Nein, ich möchte nicht dass jemand meine Arbeite nun macht aber ich bin einer derjenigen der es eher durch Sehen versteht. Wenn ihr versteht wie ich es meine?

Ich kann dazu gerne mal den kompletten Code dieser Page hier hochladen mit der Bitte aber nichts sonst noch zu ändern oder ähnliches. Das möchte ich gerne selbst hinbekommen. Nur bei diesem Unterbrechen bin ich nun echt am Ende und verliere jegliche Lust an diesem Projekt weiter zu machen. Dabei bin ich schon fast fertig:-( Also für meine Verhältnisse zumindest- Klar, der beste und sauberste Code ist es bei weitem nicht. Aber für gerade Mal eine Woche C# WPF und dies nur 1-2 Stunden Abends bin ich doch ganz stolz drauf wie weit ich es hinbekommen habe.

Doch dieses blöde Abbrechen....ahhh.

Also ich nur eine Frage ob mir dies anhand meines Codes zeigen könnte wie es aussehen müsste. Wenn nicht, ist das vollkommen ok.

30.05.2022 - 15:02 Uhr

Vielen Dank an dieser Stelle bis hierher. Ich versuche dann mal dies zu verstehen und entsprechend einzubauen. Wo auch immer und wie🙂 Egal wie, melde ich mich dann wieder.

30.05.2022 - 13:03 Uhr

HI und vielen Dank. Aber das ist mir dann doch zu hoch irgendwie:-(

Im Endeffekt muss ich bei Klick auf ABBRECHEN erwirken, dass der Task (den ich mit diesem AWAIT quasi starte, abgebrochen wird. Parallel muss aber auch das Skript slebst abgebrochen werden, da mir sonst das nächste AWAIt bzw. dessen Task ausführt.

Wie gesagt: Absoluter Neuanfänger. mache C# seid gerade mal 1 Woche und dies nebenbei quasi.:-(

30.05.2022 - 11:58 Uhr

Hallo zusammen.
Vorweg: Ich bin absoluter Neuanfänger!! 😦
Mein aktuelles Vorhaben: In C# WPF ein Tool erstellen, mit dem User seine Daten sichern und auch wieder zurück sichern kann. Er startet das Tool, klickt z.b. auf SICHERN und wird dann gefragt, wohin gesichert werden soll. Das Tool erstellt dann dort einen Ordner (Bestehend aus aktuellem Datum, dem Usernamen und dem Rechnernamen) und kopiert dort die kompletten Ordner Desktop, Dokumente, Downloads, Bilder etc..

Soweit funktioniert das auch schon bei mir prima. Habe mir alles so aus dem Internet zusammengesucht und solange herumgebastelt bis es geht🙂
Nur bei einer Sache komme ich einfach nicht weiter. Wenn der User während des Kopierens aus ABBRECHEN klickt, soll der aktuell laufende Task abgebrochen werden.

So ist mein Aufbau:
MainWindow mit einem Frame. Dort wird als erstes ein Frame namens START geladen. Klickt der User auf WEITER wird dieses Frame durch die Seite (Page) "Übersicht" ersetzt. Dort kann der User auswählen zwischen SICHERN und ZURÜCKSICHERN. Klickt er z.b. auf SICHERN, wird in das Frame die Seite (Page) "Sichern geladen wo auch dann gleich mein Programm gestartet wird.

Da ich parallel beim Kopieren eine Art Status haben wollte (Also dass gerade z.b. der Ordner Desktop kopiert wird), verwende ich async und await.
Wie gesagt. Geht bisher alles prima. Nur bekomme ich dieses Abbrechen nicht hin:-(
So rufe ich z.b. die Kopierfunktion für Desktop auf und gefolgt von Kopieren für Dokumente


#region Dateien kopieren
                Desktopbox.Visibility = Visibility.Visible;
                await Task.Run(() =>
                {
                    Kopier Desktop = new Kopier();
                    if (Desktop.Abbruch == true)
                        return;
                    Desktop.Kopieren(Quelle + @"\Desktop", pathString + @"\");
                });
                Desktopkreis.Visibility = Visibility.Hidden;
                Desktophaken.Visibility = Visibility = Visibility;


                Dokumentebox.Visibility = Visibility.Visible;
                await Task.Run(() =>
                {
                    Kopier Dokumente = new Kopier();
                    if (Dokumente.Abbruch == true)
                        return;
                    Dokumente.Kopieren(Quelle + @"\Documents", pathString + @"\");
                });
                Dokumentekreis.Visibility = Visibility.Hidden;
                Dokumentehaken.Visibility = Visibility = Visibility;


Als Funktion für das Kopieren von Ordner mit Unterordner verwende ich dieses hier, was ich als CLASS KOPIER eingebaut habe.


class Kopier
    {
        public Boolean Abbruch = false;

        #region Kopierfunktion
        public void Kopieren(string sourceDir, string destinationDir)
        {
            if (Abbruch == true)
                return;
            // alle Unterverzeichnisse des aktuellen Verzeichnisses ermitteln
            string[] subDirectories = Directory.GetDirectories(sourceDir);
            // Zielpfad erzeugen
            StringBuilder newTargetPath = new StringBuilder();
            {
                newTargetPath.Append(destinationDir);
                newTargetPath.Append(sourceDir.Substring(sourceDir.LastIndexOf(@"\")));
            }
            // wenn aktueller Ordner nicht existiert -> erstellen
            if (!Directory.Exists(newTargetPath.ToString()))
                Directory.CreateDirectory(newTargetPath.ToString());
            // Unterverzeichnise durchlaufen und Funktion mit dazu gehörigen Zielpfad erneut aufrufen (Rekursion)
            foreach (string subDirectory in subDirectories)
            {
                try
                {
                    string newDirectoryPath = subDirectory;
                    // wenn ''/'' an letzter Stelle dann entfernen
                    if (newDirectoryPath.LastIndexOf(@"\") == (newDirectoryPath.Length - 1))
                        newDirectoryPath = newDirectoryPath.Substring(0, newDirectoryPath.Length - 1);
                    // rekursiver Aufruf
                    Kopieren(newDirectoryPath, newTargetPath.ToString());
                }
                // Falls Schreibgeschützer Ordner, dann fortfahren
                catch (UnauthorizedAccessException)
                {
                    continue;
                }
            }
            // alle enthaltenden Dateien des aktuellen Verzeichnisses ermitteln
            string[] fileNames = Directory.GetFiles(sourceDir);
            foreach (string fileSource in fileNames)
            {
                // Zielpfad + Dateiname
                StringBuilder fileTarget = new StringBuilder();
                {
                    fileTarget.Append(newTargetPath);
                    fileTarget.Append(fileSource.Substring(fileSource.LastIndexOf(@"\")));
                }
                // Datei kopieren, wenn schon vorhanden dann überschreiben

                try
                {
                    File.Copy(fileSource, fileTarget.ToString(), true);
                }
                catch (IOException)
                {
                    continue;
                }
            }
        }
        #endregion Kopierfunktion
    }

Mir ist durchaus bewusst das ich hier manches total blödsinnig programmiert habe oder eher fusch ist. Ich lebe eben nach dem Motto Learning by doing🙂