Veta0208 Geschrieben 14. Juli 2004 Teilen Geschrieben 14. Juli 2004 Morgen zusammen! Ich hab folgendes Problem: Meinen Releaseordner hab ich in ein anderes verzeichnis kopiert, von dort aus, können alle User mein Programm aus starten! Jetzt ist es so, wenn ich irgendwelche Änderungen mach, dann muss ich meinen Releaseordner neu in das andere Verzeichnis kopieren und oft geht das nicht, weil dann die Meldung kommt, das es nicht überschrieben werden kann, weil die Zieldatei möglicherweise geöffnet ist!(leuchtet mir ja ein) Wie kann man sowas umgehen bzw wie macht es ihr das bei änderungen am Programm?! Ich hoffe jeder hat verstanden was ich meine! Gruß Veta0208 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. Juli 2004 Teilen Geschrieben 14. Juli 2004 Ich würde die User anweisen, das Programm nicht aus dem Veröffentlichungsordner heraus zu starten, sondern erst zu kopieren (falls du ihnen das zumuten kannst). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Veta0208 Geschrieben 14. Juli 2004 Autor Teilen Geschrieben 14. Juli 2004 Aber dann is doch so, wenn ich Änderungen mache, das die User jedesmal die Dateien rauskopieren müßten und bei 250 User(die zum teil fast keine Ahnung vom Computer haben) ist das ein bisschen schwierig! oder habs ich nur falsch verstanden!? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
NoOneKnows Geschrieben 14. Juli 2004 Teilen Geschrieben 14. Juli 2004 Du könntest eine Update-Funktion einbauen. Dazu muß das Programm immer lokal auf den Rechner des Benutzers gestartet werden. Du lieferst zum eigentlichen Programm ein Update-Programm mit. Das Hauptprogramm überprüft dann beim Start ob ein Update, sprich neue Version im Freigabeverzeichnis, vorhanden ist. Falls ja beendet es sich und startet das Update-Programm, welches wiederum die betreffenden Files lokal durch die neuen aus dem Freigabeverzeichnis ersetzt. Anschließend startet das Update-Programm die eigentliche Anwendung wieder und beendet sich. Ein simples Prinzip Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Veta0208 Geschrieben 15. Juli 2004 Autor Teilen Geschrieben 15. Juli 2004 Morgen! Das Prinzip ist einfach, aber wie soll ich sowas programmieren!? Soviel Ahnung hab ich dann leider doch noch nicht! Hast du vielleicht schon so etwas gemacht? Dann könntest du es mir evtl. schicken! Gruß Veta0208 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
NoOneKnows Geschrieben 15. Juli 2004 Teilen Geschrieben 15. Juli 2004 Ich hab sowas mal in einer anderen Programmiersprache gemacht, aber nicht in C#. Ist aber einfacher in C# Also im Hauptprogramm überprüft du am besten bevor irgendein Formular geladen wurde, ob eine neue Version des Progs im Freigabeverzeichnis vorliegt. Mit Hilfe von System.IO.FileInfo(filePath) (eine Instanz mußt du davon mit new erzeugen) kannst du an das Modifieziert-Datum kommen (LastWriteTime-Eigenschaft). Du vergleichst dann dieses Datum der aktuellen Exe-Datei (System.Windows.Forms.Application.ExecutablePath) mit dem der Executable aus dem Freigabeverzeichnis. Damit lässt sich feststellen, ob die neue Exe-Datei aktueller ist als die derzeitige. Sauberer ist der Vergleich über Versionsnummern, aber das ist glaub ich etwas komplizierter. Ist eine neue Version vorhanden, dann startest du über System.Diagnostics.Process.Start(path) das Update-Programm, daß sich im selben Pfad befinden sollte wie das Hauptproggi. Direkt danach beendet sich das Hauptprogramm über Application.Exit() selbst. Die erste Aktion des Update-Programm sollte mit System.Threading.Thread.Sleep(milliSeconds) eine kurze Wartepause sein, damit sich das Hauptproggi auch wirklich beendet hat. Da dies vielleicht immer noch nicht reicht, würde ich zuerst versuchen die Executable mit System.IO.File.Move(source, destination) zu verschieben/umzubenennen. Gibts eine Exception so warte wieder kurz mit Thread.Sleep() und versuche es erneut. Wenn es nach einigen Schleifendurchläufen nicht klappt ist irgendwas schief gelaufen. Ansonsten kannst du jetzt über System.IO.File.Copy(source, destination) die Exe-Datei aus der Freigabe kopieren. Wenn du nicht genau weißt, welche Dateien kopiert werden müssen, dann liste dir alle Dateien aus der Freigabe mit System.IO.Directory.GetFiles(path) auf und kopiere alle Dateien. Wenn es keinen Fehler gab, dann kannste nun die alte verschoben bzw. umbenannte Exe-Datei des Hauptprogramms über System.IO.File.Delete(path) löschen. Nun starte einfach das neue Programm mit Process.Start(). Danach kann sich das Update-Programm beenden. Soweit ein kurzer Abriss Du solltest den Benutzer natürlich vor dem Update informieren was passiert, damit er sich nicht wundert. Hoffe das hilf dir... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Veta0208 Geschrieben 15. Juli 2004 Autor Teilen Geschrieben 15. Juli 2004 Das hilft mir schon weiter und zum großten Teil versteht ich es ja, aber bei manchen "Sitiuationen" hackts bei mir noch ein bisschen! Kann du mir villeicht noch ein bisschen Codeschnippsel schicken, vielleicht kann ich mir dann mehr darunter vorstellen!? Danke aber schon mal für die ganze Mühe! Gruß Veta0208 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
NoOneKnows Geschrieben 15. Juli 2004 Teilen Geschrieben 15. Juli 2004 Okay, hier ein Beispiel. Sind 2 Konsolen-Programme. Mußt noch beachten, das in beide die System.Windows.Forms-DLL eingebunden wird. Auserdem mußte vielleicht noch die Pfade anpassen. AnyConsole.exe + UpdateConsole.exe müssen in einem Verzeichnis liegen. Den Pfad für die neue Version musst du entsprechend noch in beiden Programmen anpassen. Es würde sich empfehlen diese Info in eine XML-Config-Datei zu schreiben oder so. AnyConsole.exe using System; using System.IO; using System.Diagnostics; using System.Windows.Forms; namespace AnyConsole { class AnyConsole { private static string mNewVersionPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), @"..\Release\") + Path.GetFileName(Application.ExecutablePath); [STAThread] static void Main(string[] args) { if (UpdateAvailable()) { Process.Start(Path.GetDirectoryName(Application.ExecutablePath) + @"\Update.exe"); return; } Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; Console.WriteLine("Version {0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision); Console.ReadLine(); } private static bool UpdateAvailable() { if (File.Exists(mNewVersionPath)) { FileInfo newVersion = new FileInfo(mNewVersionPath); FileInfo curVersion = new FileInfo(Application.ExecutablePath); if (newVersion.LastWriteTime > curVersion.LastWriteTime) { return true; } } return false; } } } UpdateConsole.exe using System; using System.IO; using System.Diagnostics; using System.Threading; using System.Windows.Forms; namespace Update { class UpdateConsole { [STAThread] static void Main(string[] args) { Thread.Sleep(500); UpdateApplication(); } private static void UpdateApplication() { int count = 0; string targetAppPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\"; string targetApp = targetAppPath + @"AnyConsole.exe"; string newAppPath = Path.GetDirectoryName(Application.ExecutablePath) + @"\..\Release\"; while (count < 10) { count++; try { File.Delete(targetApp + ".bac"); } catch { } try { File.Move(targetApp, targetApp + ".bac"); break; } catch (Exception ex) { Console.WriteLine(ex.Message); } } if (count >= 10) { MessageBox.Show("Error occured"); return; } foreach (string filePath in Directory.GetFiles(newAppPath)) { File.Copy(filePath, targetAppPath + Path.GetFileName(filePath)); } Process.Start(targetApp); } } } Jetzt sollte das Prinzip allerdings klar sein Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Veta0208 Geschrieben 16. Juli 2004 Autor Teilen Geschrieben 16. Juli 2004 Ja, jetzt hab ichs verstanden! Wenn man das jetzt so anschaut, dann is eh garnicht so schwer! Aber darauf kommen muss man erst einmal! Vielen Dank für die ganze Mühe! Gruß Veta0208 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Argbeil Geschrieben 31. August 2004 Teilen Geschrieben 31. August 2004 Interessante Thematik. Ich hätte es so gelöst das ich einen ClassLoader programmiere der die benötigten Files erst auf den Client lädt und dann ausführt, das geht auch relativ einfach. Deine User starten also nur den Class-Loader und der lädt den eigentlichen Code und führt dessen Main-Methode aus. Die Dateien die geladen werden kannst du jederzeit tauschen. Wenn es ein kleines Tools ist könnte man auch über eine ASP.NET Variante nachdenken. In Visual Studio 2005 gibt es übrigens eine neue Möglichkeit der Verteilung, hab gerade den Namen vergessen, mit der kannst du die Applikationen über den Browser starten, die werden vorher automatisch auf den lokalen PC kopiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.