WINCE komplettes Verzeichnis kopieren

volker

Supermoderator
Teammitglied
Beiträge
5.891
Reaktionspunkte
1.063
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich breche mir gerade die Finger daran ein komplettes Verzeichnis von der '\storage card sd' auf die '"\storage card usb' zu kopieren

habe verschiedene sachen bei quelle, ziel probiert.
entweder bekomme ich als fehler 'access denied oder fehler im datei-/verzeichnisnamen.

der fehler tritt in dieser zeile auf
fs.FileCopy SmartTags("zzz_quelle"), SmartTags("zzz_ziel")

das mal das grundlegene script

Code:
Sub strom_copy_to_usb()
Dim fso,fs,datei,quelle_root,ziel_root,quelle,ziel
'On Error Resume Next

Set fs = CreateObject("filectl.filesystem")
Set fso= CreateObject("filectl.file")

quelle_root = "\storage card sd"
ziel_root = "\storage card usb"
'quelle = quelle_root & "\strom_log\*.*"
'ziel = ziel_root & "\strom_log"
zz_scriptstatus = 21
SmartTags("zzz_quelle") = quelle_root & "\strom_log\*"
SmartTags("zzz_ziel") = ziel_root & "\*"
zz_scriptstatus = 22

fs.FileCopy SmartTags("zzz_quelle"), SmartTags("zzz_ziel")
zz_scriptstatus = 23

End Sub
 
Zuletzt bearbeitet:
Hallo Volker,

der grundsätzliche Unterschied zwischen Windows und WinCE im Bezug auf VBScript ist, dass es unter WinCE keinen Befehl für das Kopieren eines ordners samt Inhalt gibt. Alle Elemente (also der Ordner selbst und die einzelnen Dateien) müssen separat behandelt werden.

Ich habe mir zu diesem Zweck für meine HMI-Projekte das folgende Script erstellt, welches abhängig vom detektierten Betriebssystem die entsprechende Kopierroutine ausführt:
Code:
Sub UtilsFIO_copyFolder(ByVal sourcePath, ByVal destinationPath, ByVal overwrite)
' ####################################################################################################
' Kopiert den gegebenen Ordner in das gegebene Zielverzeichnis. Ein existierender Ordner wird ggf.
' überschrieben. Tritt während der Abarbeitung ein Fehler auf, so werden bereits kopierte Ordner-
' inhalte nicht gelöscht.
'
' HINWEIS: Bei Geräten mit WinCE führt die Existenz von Unterverzeichnissen im Quellordner zu einem
' Fehler!
'
' @param 'sourcePath'      -> Pfad und Name des Quellordners als STRING
' @param 'destinationPath' -> Pfad und Name des Zielordners als STRING
' @param 'overwrite'       -> Überschreibe einen bereits existierenden Ordner als BOOL (wird bei WinCE-Geräten nicht berücksichtigt)
'
'
' -------------------------------------------------------------------------------------------
' |   Version   | Autor | Änderung                                                           
' -------------------------------------------------------------------------------------------
' | 01_00_00_00 |  fk   | Neuerstellung
'
' ####################################################################################################


    ' ##################################################
    ' Variablenreferenzen holen, Funktion initialisieren
    ' ##################################################
    Dim fso, fs
    Dim firstLoop, fileName
    Dim fctStatus
    
    fctStatus = EId_NO_ERROR

    On Error Resume Next




    ' ##############
    ' Funktionslogik
    ' ##############
    
    If SmartTags("osIsWinCe") Then
        Set fs = CreateObject("FileCtl.FileSystem")
        If fs.dir(sourcePath) = "" Then
            fctStatus = EId_FOLDER_DOES_NOT_EXIST
        End If
        If fctStatus = EId_NO_ERROR Then
            If fs.Dir(destinationPath) = "" Then
                fs.MkDir destinationPath
            End If
            If fs.Dir(destinationPath) = "" Then
                fctStatus = EId_FOLDER_DOES_NOT_EXIST
            End If
        End If
        If fctStatus = EId_NO_ERROR Then
            firstLoop = True
            Do
                If firstLoop Then
                    fileName = fs.Dir(sourcePath & "\*.*")
                    firstLoop = False
                Else
                    fileName = fs.Dir
                End If
                If fileName <> "" Then
                    If UtilsFIO_doesFileExist(destinationPath & "\" & fileName) Then
                        fs.kill destinationPath & "\" & fileName
                    End If
                    fs.FileCopy (sourcePath & "\" & fileName), (destinationPath & "\" & fileName)
                    fctStatus = Err.Number
                    If fctStatus > EId_NO_ERROR Then
                        Exit Do
                    End If
                Else
                    Exit Do
                End If
            Loop
        End If
    Else
        Set fso = CreateObject("Scripting.FileSystemObject")
        fso.CopyFolder sourcePath, destinationPath, overwrite
        fctStatus = Err.Number
    End If
    
    
    
    
    ' ################
    ' Funktionsausgang
    ' ################

    ' Funktionsstatus global bekanntmachen
    SmartTags("fctStatus_global") = fctStatus


    Set fs = Nothing
    Set fso = Nothing

    Err.Clear
    On Error GoTo 0
    

End Sub
 
Leider funktioniert das Script nicht

Was hat es mit EId_NO_ERROR und EId_FOLDER_DOES_NOT_EXIST auf sich?

Ich habe jetzt mal ein bisschen rumprobiert
Code:
Do
        SmartTags("zz_scriptstatus")=SmartTags("zz_scriptstatus")+1
        SmartTags("filename") = ""
        SmartTags("filename") = fs.dir (quell_verz & "\*.*")
        SmartTags("zs_wartezeit") = 2
        warte
        If fs.dir = "" Then
            Exit Do
        End If
Loop
Normal würde ich erwarten, dass SmartTags("filename") alle Dateien des Ordners listet und wenn alle Dateien gelesen wurden fs.dir = "" liefert.
Tut es aber nicht. SmartTags("filename") hat immer den Name der ersten Datei und das Script hängt in einer Endlosschleife.
Oder mach ich was falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Volker,

fs.Dir mit Parameter liest einmal die Liste der Dateien im Verzeichnis, entsprechend dem übergebenen Muster. Bei weiteren Aufrufen ohne Parameter gibt sie immer die nächste Datei zurück.

Such mal im Netz nach der Funktion.

Ich würde die Schleife nicht unbedingt mit SmartTags laufen lassen, weil SmartTags sind ja immer Variablen, die dem HMI zur Verfügung stehen und dann auch ggf. mit der SPS abgeglichen werden. Das wird die Performance des Scriptes sicherlich deutlich einschränken und ggf. Deine Kommunikationslast erhöhen. Ich würde das nur mit Script-internen Variablen machen.

Gruß
Jens
 
fs.Dir mit Parameter liest einmal die Liste der Dateien im Verzeichnis, entsprechend dem übergebenen Muster. Bei weiteren Aufrufen ohne Parameter gibt sie immer die nächste Datei zurück.
Du meinst sicherlich das Richtige, Jens.
Jeder fs.Dir-Aufruf übergibt immer nur 1 Ergebnis bzw. "", wenn nicht gefunden.
Wenn Wildcards verwendet werden (* bzw. ?), wird der erste passende Eintrag gemeldet ("erste" vermutlich in der Reihenfolge, in der die Einträge erfolgt sind - aber nicht sortiert nach Namen, Typ, Datum etc.).
Alle weiteren, passenden Ergebnisse können nur durch fs.Dir-Aufrufe "mit ohne" Parameter abgefragt werden ... bis "" gemeldet wird.
 
In volkers VBS-FAQ in #1 ist auch die PDF der VBS-Dateifunktionen unter WinCE mit der Beschreibung der Dir-Methode. Die muß zuerst mit Parameter mit dem Dateinamen-Muster aufgerufen werden und liefert genau einen Dateiname der zum Muster passt, oder den Leerstring "" wenn keiner gefunden wurde. Für das Abholen der weiteren passenden Dateinamen muß Dir ohne Parameter noch so oft aufgerufen werden, bis es keine weiteren Dateinamen gibt, bis also Dir "" liefert.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Volker,

ich hätte vielleicht doch noch ein paar Takte zu meinem Script erklären sollen, sorry.

Die Konstanten "EId_..." sind (globale) HMI-Variablen. Ich verwende solche Konstanten so häufig in meinem HMI-Projekt, dass ich sie nicht jedesmal separat deklariere, sondern einmalig beim Starten.
In diesem Fall hat "EId_NO_ERROR" den Wert 0 und "EId_FOLDER_DOES_NOT_EXIST" den Wert 1107 (der aber hier unerheblich ist, da innerhalb des Scriptes nicht weiter abgefragt wird.).

Was genau funktioniert denn bei dir nicht? Ich habe dieses Script seit nunmehr 8 Jahren fast unverändert im Einsatz...


Gruß, Fred
 
Hallo,

ich versuche das Skript gerade auf einem TP1500 zum laufen zu bekommen.

ich habe das skript auch schon soweit Fehler frei, aber an einer stelle komme ich nicht weiter.

"If UtilsFIO_doesFileExist(destinationPath & "\" & fileName) Then" --> UtilsFIO_doesFileExist damit kann ich nix anfangen.

wäre nicht FS.FileExist richtig?

Gruß
Stephan
 
"If UtilsFIO_doesFileExist(destinationPath & "\" & fileName) Then" --> UtilsFIO_doesFileExist damit kann ich nix anfangen.

wäre nicht FS.FileExist richtig?
Nein, weil Du brauchst die Anweisung für Windows CE. Die Unterschiede siehe mal diese FAQ: Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script, und dort im Beitrag #3 findest Du eine Function FileExist()

Ich denke, das UtilsFIO_doesFileExist kapselt die verschiedenen FileExist-Funktionen je nach Runtime-Umgebung (Windows-Version) und sieht intern vermutlich so aus:
Code:
' Function UtilsFIO_doesFileExist(Path) prüft, ob die angegebene Datei vorhanden ist
' Rückgabewert muß True/False sein!
' Skript kann unter OP-WinCE und PC-Windows laufen
' Path darf unter WinCE wildcards *? enthalten
Dim fso

UtilsFIO_doesFileExist = False
If SmartTags("osIsWinCe") Then 'WinCE
    Set fso = CreateObject("FileCtl.FileSystem")
    If fso.Dir(Path) <> "" UtilsFIO_doesFileExist = True
Else 'PC-Windows
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(Path) Then UtilsFIO_doesFileExist = True
End If

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Stephan, hallo Harald.

Ich hatte das Script damals als Beispiel eingestellt, um Volker eine "Starthilfe" zu geben. Er hatte damals (leider) nicht auf meine Rückfrage reagiert.

"UtilsFIO_doesFileExist(destinationPath & "\" & fileName)" ist ein weiteres Script, welches -wie Harald schon richtig erkannt hat- die betriebssystem-abhängigen Versionen von "FileExist" kapselt. Ich wusste gar nicht mehr, dass ich es hier verwendet hatte/habe.

@harald:
Gut vermutet, sieht tatsächlich sehr ähnlich aus; einziger relevante Unterschied: ich verwende eine Hilfsvariable und übergebe damit den Rückgabewert erst und einmalig am Script-Ende.
 
Hallo Fred

ich habe dank der Hilfe vom @PN/DP das Skript gestern zum laufen bekommen.

Ich habe mir das soweit angepasst das es nur auf Win CE läuft. Ich werde wohl noch die Fehler merker aussortieren um das Skript kleiner zu machen.

Code:
Sub Kopieren()
' ####################################################################################################
' Kopiert den gegebenen Ordner in das gegebene Zielverzeichnis. Ein existierender Ordner wird ggf.
' überschrieben. Tritt während der Abarbeitung ein Fehler auf, so werden bereits kopierte Ordner-
' inhalte nicht gelöscht.
'
' HINWEIS: Bei Geräten mit WinCE führt die Existenz von Unterverzeichnissen im Quellordner zu einem
' Fehler!
'
' @param 'sourcePath'      -> Pfad und Name des Quellordners als STRING
' @param 'destinationPath' -> Pfad und Name des Zielordners als STRING
' @param 'overwrite'       -> Überschreibe einen bereits existierenden Ordner als BOOL (wird bei WinCE-Geräten nicht berücksichtigt)
'
'
' -------------------------------------------------------------------------------------------
' |   Version   | Autor | Änderung                                                           
' -------------------------------------------------------------------------------------------
' | 01_00_00_00 |  fk   | Neuerstellung
'
' ####################################################################################################


    ' ##################################################
    ' Variablenreferenzen holen, Funktion initialisieren
    ' ##################################################
    Dim fso, fs
    Dim firstLoop, fileName
    Dim fctStatus
    Dim UtilsFIO_doesFileExist
 
    fctStatus = EId_NO_ERROR

    On Error Resume Next

    SmartTags("sourcePath")= SmartTags("UnterordnerTK1")
    SmartTags("destinationPath")="\storage card usb"

    UtilsFIO_doesFileExist = False

    ' ##############
    ' Funktionslogik
    ' ##############
    
        Set fs = CreateObject("FileCtl.FileSystem")
        If fs.dir(sourcePath) = "" Then
            fctStatus = EId_FOLDER_DOES_NOT_EXIST
              
        End If
        If fctStatus = EId_NO_ERROR Then
            If fs.Dir(destinationPath) = "" Then
                fs.MkDir destinationPath
                  
            End If
            If fs.Dir(destinationPath) = "" Then
                fctStatus = EId_FOLDER_DOES_NOT_EXIST
                  
            End If
        End If
        If fctStatus = EId_NO_ERROR Then
            firstLoop = True
            Do
                If firstLoop Then
                    fileName = fs.Dir(sourcePath & "\*.*")
                    firstLoop = False
                      
                Else
                    fileName = fs.Dir
                      
                End If
                If fileName <> "" Then
                    If UtilsFIO_doesFileExist(destinationPath & "\" & fileName) Then
                        fs.kill destinationPath & "\" & fileName
                    End If
                    fs.FileCopy (sourcePath & "\" & fileName), (destinationPath & "\" & fileName)
                    fctStatus = Err.Number
                     ShowSystemAlarm sourcePath & "\" & fileName
                     ShowSystemAlarm destinationPath & "\" & fileName
                    If fctStatus > EId_NO_ERROR Then
                        Exit Do
                    End If
                Else
                    Exit Do
                End If
            Loop
        End If
  
    
    
    
    
    ' ################
    ' Funktionsausgang
    ' ################

    ' Funktionsstatus global bekanntmachen
    SmartTags("fctStatus_global") = fctStatus
 ShowSystemAlarm "8"

    Set fs = Nothing
    Set fso = Nothing

    Err.Clear
    On Error GoTo 0
    


End Sub

Momentan kopiert der mit beliebig viele csv Dateien die in einem Ordner sind direkt auf einen USB Stick.
Ich benötige aber noch etwas mehr.

Ich habe verschiedene Ordner auf der \Storage card SD in denen sich die CSV Dateien befinden.
Schön wäre wenn ich die Ordner mit kopieren könnte.

Beispiel:
\storage card SD\Trockner1\Charge1\Daten1.csv --> \storage card USB\Trockner1\Charge1\Daten1.csv
\storage card SD\Trockner1\Charge1\Daten2.csv --> \storage card USB\Trockner1\Charge1\Daten2.csv

\storage card SD\Trockner1\Charge2\Daten1.csv --> \storage card USB\Trockner1\Charge2\Daten1.csv
\storage card SD\Trockner1\Charge2\Daten2.csv --> \storage card USB\Trockner1\Charge2\Daten2.csv

\storage card SD\Trockner2\Charge4\Daten1.csv --> \storage card USB\Trockner2\Charge4\Daten1.csv
\storage card SD\Trockner2\Charge4\Daten2.csv --> \storage card USB\Trockner2\Charge4\Daten2.csv


Ich werde die tage mal versuchen das Skript zu erweitern ;) oder gibt es da schon was fertiges?


Danke für eure unterstützung

Stephan
 
Ich habe mir das soweit angepasst das es nur auf Win CE läuft.
Dann funktionieren die Skripts nicht, wenn Du das Panelprojekt auf einem PC simulierst. Aber da wirst Du vermutlich eh' keine SD-Karte kopieren müssen.

Ich habe verschiedene Ordner auf der \Storage card SD in denen sich die CSV Dateien befinden.
Schön wäre wenn ich die Ordner mit kopieren könnte.
Rufe das Skript doch einfach für jeden Ordner einzeln auf.

Ein paar Anregungen:

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Fred

ich habe dank der Hilfe vom @PN/DP das Skript gestern zum laufen bekommen.

Ich habe mir das soweit angepasst das es nur auf Win CE läuft. Ich werde wohl noch die Fehler merker aussortieren um das Skript kleiner zu machen.

Code:
Sub Kopieren()
' ####################################################################################################
' Kopiert den gegebenen Ordner in das gegebene Zielverzeichnis. Ein existierender Ordner wird ggf.
' überschrieben. Tritt während der Abarbeitung ein Fehler auf, so werden bereits kopierte Ordner-
' inhalte nicht gelöscht.
'
' HINWEIS: Bei Geräten mit WinCE führt die Existenz von Unterverzeichnissen im Quellordner zu einem
' Fehler!
'
' @param 'sourcePath'      -> Pfad und Name des Quellordners als STRING
' @param 'destinationPath' -> Pfad und Name des Zielordners als STRING
' @param 'overwrite'       -> Überschreibe einen bereits existierenden Ordner als BOOL (wird bei WinCE-Geräten nicht berücksichtigt)
'
'
' -------------------------------------------------------------------------------------------
' |   Version   | Autor | Änderung                                                          
' -------------------------------------------------------------------------------------------
' | 01_00_00_00 |  fk   | Neuerstellung
'
' ####################################################################################################


    ' ##################################################
    ' Variablenreferenzen holen, Funktion initialisieren
    ' ##################################################
    Dim fso, fs
    Dim firstLoop, fileName
    Dim fctStatus
    Dim UtilsFIO_doesFileExist
 
    fctStatus = EId_NO_ERROR

    On Error Resume Next

    SmartTags("sourcePath")= SmartTags("UnterordnerTK1")
    SmartTags("destinationPath")="\storage card usb"

    UtilsFIO_doesFileExist = False

    ' ##############
    ' Funktionslogik
    ' ##############
   
        Set fs = CreateObject("FileCtl.FileSystem")
        If fs.dir(sourcePath) = "" Then
            fctStatus = EId_FOLDER_DOES_NOT_EXIST
             
        End If
        If fctStatus = EId_NO_ERROR Then
            If fs.Dir(destinationPath) = "" Then
                fs.MkDir destinationPath
                 
            End If
            If fs.Dir(destinationPath) = "" Then
                fctStatus = EId_FOLDER_DOES_NOT_EXIST
                 
            End If
        End If
        If fctStatus = EId_NO_ERROR Then
            firstLoop = True
            Do
                If firstLoop Then
                    fileName = fs.Dir(sourcePath & "\*.*")
                    firstLoop = False
                     
                Else
                    fileName = fs.Dir
                     
                End If
                If fileName <> "" Then
                    If UtilsFIO_doesFileExist(destinationPath & "\" & fileName) Then
                        fs.kill destinationPath & "\" & fileName
                    End If
                    fs.FileCopy (sourcePath & "\" & fileName), (destinationPath & "\" & fileName)
                    fctStatus = Err.Number
                     ShowSystemAlarm sourcePath & "\" & fileName
                     ShowSystemAlarm destinationPath & "\" & fileName
                    If fctStatus > EId_NO_ERROR Then
                        Exit Do
                    End If
                Else
                    Exit Do
                End If
            Loop
        End If
 
   
   
   
   
    ' ################
    ' Funktionsausgang
    ' ################

    ' Funktionsstatus global bekanntmachen
    SmartTags("fctStatus_global") = fctStatus
 ShowSystemAlarm "8"

    Set fs = Nothing
    Set fso = Nothing

    Err.Clear
    On Error GoTo 0
   


End Sub

Momentan kopiert der mit beliebig viele csv Dateien die in einem Ordner sind direkt auf einen USB Stick.
Ich benötige aber noch etwas mehr.

Ich habe verschiedene Ordner auf der \Storage card SD in denen sich die CSV Dateien befinden.
Schön wäre wenn ich die Ordner mit kopieren könnte.

Beispiel:
\storage card SD\Trockner1\Charge1\Daten1.csv --> \storage card USB\Trockner1\Charge1\Daten1.csv
\storage card SD\Trockner1\Charge1\Daten2.csv --> \storage card USB\Trockner1\Charge1\Daten2.csv

\storage card SD\Trockner1\Charge2\Daten1.csv --> \storage card USB\Trockner1\Charge2\Daten1.csv
\storage card SD\Trockner1\Charge2\Daten2.csv --> \storage card USB\Trockner1\Charge2\Daten2.csv

\storage card SD\Trockner2\Charge4\Daten1.csv --> \storage card USB\Trockner2\Charge4\Daten1.csv
\storage card SD\Trockner2\Charge4\Daten2.csv --> \storage card USB\Trockner2\Charge4\Daten2.csv


Ich werde die tage mal versuchen das Skript zu erweitern ;) oder gibt es da schon was fertiges?


Danke für eure unterstützung

Stephan
Bei Ausführung dieses Skriptes (TP700, TIA V16) kommen bei mir Fehlermeldungen:

Code:
Es wurde kein Objekt VB_Skript oder HMI_Variable mit dem Namen "Eid_NO_ERROR" gefunden in Zeile ..
Es wurde kein Objekt VB_Skript oder HMI_Variable mit dem Namen "EId_FOLDER_DOES_NOT_EXIST" gefunden in Zeile ..
 
Bei Ausführung dieses Skriptes (TP700, TIA V16) kommen bei mir Fehlermeldungen:

Code:
Es wurde kein Objekt VB_Skript oder HMI_Variable mit dem Namen "Eid_NO_ERROR" gefunden in Zeile ..
Es wurde kein Objekt VB_Skript oder HMI_Variable mit dem Namen "EId_FOLDER_DOES_NOT_EXIST" gefunden in Zeile ..
siehe Beitrag #9 (und auch die nachfolgenden Beiträge)
Bitte nicht wahllos Skripte ausprobieren, sondern auch den Thread dazu etwas lesen und durchsuchen.
 
Zurück
Oben