vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Dateisystem · Dateien allgemein   |   VB-Versionen: VB4, VB5, VB626.07.04
Ersetzen von Dateien, die in Benutzung sind

Haben Sie sich nicht schon lange gefragt, wie man unter Windows Dateien austauscht, die im Zugriff sind? Dieser Tipp verrät, wie´s geht.

Autor:   Gerhard KuklauBewertung:     [ Jetzt bewerten ]Views:  16.305 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

Haben Sie sich nicht auch schon einmal gefragt, wie man unter Windows Dateien austauscht, die gerade in Benutzung sind?

Wer hat nicht schon immer mal wissen wollen, wie man die Exe-Datei austauscht, die gerade geladen ist?

Unter Windows können Dateien, die im Zugriff sind, nicht einfach ausgetauscht werden.
Das ist insbesondere dann ärgerlich, wenn man in der Anwendung einen eigenen Update-Service integrieren möchte.

Auch Microsoft hat dies erkannt und dem Windows-Betriebsystem einen Mechanismus spendiert, der genau dafür vorgesehen ist:

MoveFileEx

Der Name ist vielversprechend

Wir bauen heute eine Function um diese API, die neben einem sprechenden Namen fChangeFileOnReboot auch eine bequeme Handhabung ermöglicht.

Aber bevor wir damit loslegen, noch ein Hinweis zu den Bedingungen, die unbedingt einzuhalten sind:

  • Das Parkverzeichnis, in dem wir die zu kopierende Datei vorhalten, muß auf dem gleichen Laufwerk (Partition) liegen, von der das System gebootet wird.
  • Die API-Funktion muß für jede zu kopierende Datei mit den entsprechenden Werten aufgerufen werden (das gilt dann natürlich auch für unsere Function).
  • Die Datei(en) müssen in das Parkverzeichnis kopiert werden. Diese Arbeit wird von der Function nicht geleistet!

Fügen Sie Ihrem Projekt zunächst ein neues Modul hinzu und fügen im Folgenden den Code in dieses Modul ein.
Beginnen wir mit den Deklarationen der benötigten API-Funktionen:

Option Explicit
' -------------------------------------------------------------------
' Austauschen von Dateien, die im Zugriff sind:
' =============================================
' Unter Windows können Dateien, die im Zugriff sind, nicht einfach
' ausgetauscht werden. Dafür gibt es einen Mechnismus, der die
' Dateien beim Boot (Reboot, Restart) vor Erstellung des Windows-Swap-Files
' kopiert.
' Voraussetzung ist:
' - Quell- und Zieldatei müssen auf dem gleichen Laufwerk liegen
' - Aufruf der Function MoveFileEx mit dem Flag MOVEFILE_DELAY_UNTIL_REBOOT
' -------------------------------------------------------------------
 
Private Declare Function MoveFileEx Lib "kernel32" _
  Alias "MoveFileExA" ( _
  ByVal lpExistingFileName As String, _
  ByVal lpNewFileName As String, _
  ByVal dwFlags As Long) As Long
 
Private Const MOVEFILE_REPLACE_EXISTING = &H1
Private Const MOVEFILE_COPY_ALLOWED = &H2
Private Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4

Danach kommen wir zur eigentlichen Funktion

Wie versprochen, wollen wir der Funktion ein wenig Intelligenz mitgeben, um komfortabel darauf zurückgreifen zu können. Die Funktion fChangeFileOnReboot gibt einen Rückgabewert vom Typ "Boolean" zurück, der über den Erfolg bzw. Mißerfolg Auskunft gibt.

Die beiden Übergabeparameter "ExistingFile" und "NewFile" sprechen für sich.

Public Function fChangeFileOnReboot( _
  ExistingFile As String, NewFile As String) As Boolean
 
  Dim lRet As Long
 
  ' ------------------------------------------------------
  ' Ist eine der beiden Dateinamen nicht übergeben worden, 
  ' wird die Function beendet und gibt False zurück:
  ' ======================================================
  If ExistingFile = "" Or NewFile = "" Then
    fChangeFileOnReboot = False
    Exit Function
  End If
 
  ' -------------------------------------------------------------------
  ' Eintragen der Dateipfade zum Austausch beim nächsten Reboot (Boot):
  ' ===================================================================
  lRet = MoveFileEx(ExistingFile, NewFile, MOVEFILE_DELAY_UNTIL_REBOOT + _ 
    MOVEFILE_REPLACE_EXISTING)
 
  ' --------------------------------------------------------
  ' Wenn die Function fehlerfrei ausgeführt wurde, dann wird
  ' ein Long-Wert > 0 zurückgegeben:
  ' ========================================================
  fChangeFileOnReboot = (lRet > 0)  
End Function

Kommen wir zur praktischen Anwendung der Funktion fChangeFileOnReboot.
Im folgenden Beispiel soll die "MyApp.exe" ausgetauscht werden, die in unserem Beispiel als Servertask (z.B. als Dienst) ständig geladen ist.

If fChangeFileOnReboot("c:\Files_Parken\MyApp.exe", _
  "c:\Programme\MyApp\MyApp.exe") = True Then
 
  MsgBox “Datei MyApp.exe wird beim nächsten Reboot ausgetauscht”
End If

Tja, und wenn jetzt das System neu gestartet wird, dann wird auch die Datei ausgetauscht.
 

Dieser Tipp wurde bereits 16.305 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel