| |
|
|
- Seite 1 - |
|
| Beschreibung:
Mit der API SHFileOperation kann man ganze Ordner oder einzelne Dateien mit Forschrittsanzeige kopieren, löschen (auch Papierkorb), verschieben oder umbenenen.
Deklaration:
Def @SHFileOperation(1) !SHELL32,SHFileOperationA
Parameter:
1.Parameter: Structur oder 30 Byte große Bereichsvariable => -Byte 0-3 = Handle des Fensters, auf dem der Fortschrittsdialog erscheinen soll. -Byte 4-7 = Flag für die durchzuführende Aktion => $1 = verschieben; $2=kopieren; $2=löschen; $4=umbenenen -Byte 8-11 = Adresse einer Bereichvariablen, die die zu modifizierende(n) Datei(en) oder Ordner enthält. Diese Bereichvariable muß als Abschluß zwei Nullbytes enthalten. Einzelne Dateien oder Ordner werden mit einem Nullbyte getrennt. -Byte 12-15 = Adresse einer Bereichvariablen, die die Ziel-datei(en) oder -ordner enthält. Diese Bereichvariable muß als Abschluß zwei Nullbytes enthalten. Einzelne Dateien oder Ordner werden mit einem Nullbyte getrennt. -Byte 16-17 = Flag für die weitere Optionen der durchzuführenden Aktion => $40 = Wenn möglich werden Undoinformationen gespeichert. $80 = Wenn Wildcards (*.*) verwendet werden, nur Dateien berücksichtigen. $1 = Es gibt mehrere Zielordner. $10 = Keine Einzelbestätigung. $200 = Das Erstellen eines Ordners muß nicht bestätigt werden. $2000 = Verbundene Files nicht als Gruppe verschieben. $800 = Es werden keine Security Attribute kopiert (NT/2000/XP) $400 = Es wird kein Userinterface bei einem Fehler ausgegeben. $1000 = Es werden keine Unterverzeichnisse berücksichtigt (nur aktuelles Verzeichnis). $8 = Wenn Filename schon vorhanden ist, anderen Namen geben! $4 = Es wird kein Fortschrittsdialog angezeigt. $100 = Nur Fortschrittsdialog, keinen Dateinamen anzeigen! $20 = Es wird ein Mapping Objekt mit den alten und neuen Dateinamen erzeugt, wenn $8 spezifiziert wurde und Files umbenannt wurden. -Byte 18-21 = Rückgabeflag. Wenn der User eine Aktion abgebrochen hat, steht hier 1. -Byte 22-25 = Hier steht als Rückgabe das Handle des Mapping Objektes, wenn $20 spezifiziert wurde. -Byte 26-29 = Die Adresse eines Textstrings als Überschrift für den Fortschrittsdialog, wenn $100 spezifiziert wurde.
Rückgabewert:
0 bei Erfolg, 1 bei Fehler.
Beispiele:
KompilierenMarkierenSeparierenDef @SHFileOperation(1) !SHELL32,SHFileOperationA
Proc Fileaction
Parameters Action$,File$,File2$,noconfirm%,norecycle%
Parameter 1: Auszuführende Aktion=COPY, DELETE, RENAME, MOVE
Parameter 2: Quelldatei
Parameter 3: Zielldatei
Parameter 4: 0 = User erst fragen, 1= ohne Nachfrage löschen
Parameter 5: 0 = In Papierkorb verschieben, 1= endgültig löschen
Declare FOF_Flag%,Action&,DO%,Fehler&
Declare opstruct#,file#,file2#
LET DO%=0
IF @upper$(Action$)=RENAME
Let Action&=4
elseIF @upper$(Action$)=COPY
Let Action&=2
elseIF @upper$(Action$)=MOVE
Let Action&=1
elseIF @upper$(Action$)=DELETE
Let Action&=3
else
@messagebox(Diese Funktion ist nicht bekannt!,Aktion wird nicht ausgeführt!,64)
LEt DO%=1
endif
IF DO%=0
Case noconfirm% : Let noconfirm%=16
CaseNot norecycle% : Let norecycle%=64
Let FOF_Flag% = @or(noconfirm%,norecycle%)
Dim opstruct#,30
Dim file#,Add(Len(file$),2)
Dim file2#,Add(Len(file2$),2)
String file#,0=@Add$(file$,@Chr$(0))
String file2#,0=@Add$(file2$,@Chr$(0))
Long opstruct#,0=%hwnd Handle des aufrufenden Fensters
Long opstruct#,4=Action&
Long opstruct#,8=file# pfrom : hier der zu löschende Ordner
Long opstruct#,12=file2# pto (muß 0 oder eine Bereichvar. mit Zieldateinamen z.B. bei Umbenennung sein
Word opstruct#,16=FOF_Flag%
Long opstruct#,18=0 Hier steht nach dem Aufruf 1, wenn User abgebrochen hat
Long opstruct#,22=0 Unbedingt immer auf Null setzen!
Long opstruct#,26=0 Zeiger(Bereich) auf Überschrift des Fortschrittsdialogs
LET FEHLER&=@ShFileOperation(opstruct#)
IF @equ(@long(opstruct#,18),1)
@MessageBox(Die Dateioperation wurde abgebrochen!,Operation abgebrochen!,64)
ELSEIF @neq(Fehler&,0)
@MessageBox(Es ist ein Fehler aufgetreten,ShFileOperation +@str$(Fehler&),16)
EndIf
Dispose file#
Dispose file2#
Dispose opstruct#
endif
EndProc
REM Beispiel
Fileaction COPY,C:WINDOWS,E:TEMP,0,0
Fileaction DELETE,E:TEMP,,1,1
|
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
| Er brauch einen Code, kein Bild |
|
|
| |
|
|
|
Dieter Zornow | Ich denke diese Datei kann nicht kopiert werden. Ich hatte es mit verschiedenen bekannten Commandern versucht, keiner konnte sie kopieren und Unlocker gelang es auch nicht sie freizugeben. Ich denke er sollte die Dateien einzeln kopieren und wenn ein Fehler auftritt die nächste kopieren. |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 23.06.2008 ▲ |
|
|
|
|
J. Strahl | [
Er brauch einen Code, kein Bild
GENAU
Die Datei kann und muß nicht kopiert werden. Allerdings bricht das kopieren an der Stelle ab und kopiert den Rest in dem Ordner nicht mehr weiter. Da im Laufe der Zeit dort immer mehr Dateien abgelegt werden kann ich auch nicht einfach Unterordner kopieren. Deshalb würde ich gerne der Funktion sagen Hallo, keine Fehlermeldung wenn du was nicht kopieren kannst, aber kopiere weiter
Und nu weiß ich nicht wie ich dem FOF_Flag% das einverleiben kann wenn es überhaupt geht. Weiß das einer ? |
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 23.06.2008 ▲ |
|
|
|
|
| ...ich hab das jetzt mal so gemacht - Vielleicht hilft Dir der Anfang - ich bin kein API-Progi - aber so wird die Datei übersprungen beim Kopieren: KompilierenMarkierenSeparieren |
|
|
| |
|
|
|
| Ich schrieb doch oben schon iF
Einfach Word opstruct#,16=FOF_Flag% | ~FOF_NOERRORUI hier weitere anhängen | blub | brab |solali
FOF_Flag% kannst Du unangefasst lassen. |
|
|
| |
|
|
|
J. Strahl | Definition im Header fehlt
wenn ich das so eingebe:
Word opstruct#,16=FOF_Flag% | ~FOF_NOERRORUI
äh, wie oben beschrieben blutiger Anfänger. Ich hoffe ich nerv euch nicht zu stark.
Ich vermute mal IF das du Sachen vorraussetzt die ich ( noch ) nicht kenne muhaha -
Sollte ~FOF_NOERRORUI nicht einen Zahlenwert haben ? |
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 23.06.2008 ▲ |
|
|
|
|
| Für sowas hatte ich Konstantinopel programmiert: [...] Die Helferrubrik [...] birgt einige Schätze! Übrigens, XPSE hat diese Konstanten intus - da braucht man keine solchen Header mehr und auch kein ~-Zeichen. |
|
|
| |
|
|
|
J. Strahl | OK OK - dann bin ich ja doch nicht so unbeholfen.
Den Wert den ich brauche is 1024 der zusätzlich zu den Werten noconfirm% und norecycle% zuaddiert werden.
sprich :
Word opstruct#,16=FOF_Flag% + 1024
Richtig ?
Des ham wa schon getestet. Leider, leider muß ich sagen das dann der Kopiervorgang abgebrochen wird. Und der soll muß weitergehen.
Noch weitere Ideen ? |
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 23.06.2008 ▲ |
|
|
|
|
| Besser nicht addieren sondern mit binärem or verknüpfen, also word ops....,16=fof_flag% | 1024 | blub | japp |
|
|
| |
|
|
|
J. Strahl | Erst ma ein dicken danke schön an alle die sich hier die Finger wund geschrieben haben ( IF ) - Bin nun zu folgendem Ergebniß gekommen.
Word opstruct#,16=FOF_Flag% | 1024
ersetzt und leider nur ein Programmabbruch. Gibt es vieleicht noch andere Möglichkeiten ? Ohne die @SHFileOperation(1) !SHELL32,SHFileOperationA Funktion zu nutzen ?
|
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 23.06.2008 ▲ |
|
|
|
|
Dieter Zornow | Versuchs mal so, der Code ist getestet. Es wird alles kopiert was geht ohne Programmabbruch KompilierenMarkierenSeparierenDef GetFullPathName(4) ! Kernel32,GetFullPathNameA
Def @SHFileOperation(1) !SHELL32,SHFileOperationA
Proc GetFullName
Parameters name$
Declare buf1#,buf2#
Dim buf1#,560 +1
Dim buf2#,560 +1
GetFullPathName(Addr(name$),511,buf1#,buf2#)
Name$=String$(buf1#,0)
Dispose buf1#
Dispose buf2#
Return name$
EndProc
Proc Fileaction
Parameters Action$,File$,File2$,noconfirm%,norecycle%
Parameter 1: Auszuführende Aktion=COPY, DELETE, RENAME, MOVE
Parameter 2: Quelldatei
Parameter 3: Zielldatei
Parameter 4: 0 = User erst fragen, 1= ohne Nachfrage löschen
Parameter 5: 0 = In Papierkorb verschieben, 1= endgültig löschen
Declare FOF_Flag%,Action&,DO%,Fehler&
Declare opstruct#,file#,file2#
LET DO%=0
IF @upper$(Action$)=RENAME
Let Action&=4
elseIF @upper$(Action$)=COPY
Let Action&=2
elseIF @upper$(Action$)=MOVE
Let Action&=1
elseIF @upper$(Action$)=DELETE
Let Action&=3
else
@messagebox(Diese Funktion ist nicht bekannt!,Aktion wird nicht ausgeführt!,64)
LEt DO%=1
endif
IF DO%=0
Case noconfirm% : noconfirm%=16
CaseNot norecycle% : norecycle%=64
Let FOF_Flag% = (noconfirm% | norecycle% | 1024)
Dim opstruct#,30
Dim file#,(Len(file$) + 2)
Dim file2#,(Len(file2$) + 2)
String file#,0= (file$ + Chr$(0))
String file2#,0=(file2$ + Chr$(0))
Long opstruct#,0=%hwnd Handle des aufrufenden Fensters
Long opstruct#,4=Action&
Long opstruct#,8=file# pfrom : hier der zu löschende Ordner
Long opstruct#,12=file2# pto (muß 0 oder eine Bereichvar. mit Zieldateinamen z.B. bei Umbenennung sein
Word opstruct#,16=FOF_Flag%
Long opstruct#,18=0 Hier steht nach dem Aufruf 1, wenn User abgebrochen hat
Long opstruct#,22=0 Unbedingt immer auf Null setzen!
Long opstruct#,26=0 Zeiger(Bereich) auf Überschrift des Fortschrittsdialogs
LET FEHLER&=@ShFileOperation(opstruct#)
IF long(opstruct#,18) = 1
Print long(opstruct#,18)
ELSEIF (Fehler& <> 0)
Print Fehler
EndIf
Dispose file#
Dispose file2#
Dispose opstruct#
endif
EndProc
REM Beispiel
cls
Declare name$
chdir c:Dokumente und Einstellungen\%userprofile%Lokale EinstellungenAnwendungsdatenMicrosoftWindows
clearlist
addfiles *.*
whileloop 0, %getcount
name$ = Getfullname(ListBoxItem$(&loop))
Fileaction COPY,name$+chr$(0),C:TEMP,0,0
endwhile
waitinput
end
|
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 23.06.2008 ▲ |
|
|
|
|
J. Strahl | Danke Dieter. Das funktioniert, allerdings nur innerhalb des Ordners. Da ich den Oberordner aber kopieren will, der sich im Laufe der Zeit ja immer mehr füllt und ich vorher nicht weiß welche neuen Ordner hinzukommen, komme ich da so auch nicht weiter. Aber net so schlimm, aufgrund der vorhandenen Informationen und deiner habe ich das Problem in den Griff bekommen. Es geht ja hauptsächlich um diese 2 Dateien die während des Betriebes nicht kopiert werden können und die Funktion dadurch abbricht ohne den Rest weiter zu kopieren. Ich habe die 2 Dateien nun einfach rausgeschnitten. KompilierenMarkierenSeparierenchdir @ADD$(Pfad$,Lokale EinstellungenAnwendungsdaten)
clearlist
addfiles *.*
whileloop 0, %getcount
if ListBoxItem$(&loop)=[.]
elseif ListBoxItem$(&loop)=[..]
elseif ListBoxItem$(&loop)=[Microsoft]
else
ifnot @Left$(ListBoxItem$(&loop),1)=[
else
dat$=@Left$(ListBoxItem$(&loop),LEN(ListBoxItem$(&loop))-1)
dat$=@Right$(dat$,LEN(dat$)-1)
Fileaction COPY,@ADD$(@ADD$(Pfad$,Lokale EinstellungenAnwendungsdaten),dat$),@ADD$(@ADD$($ProgDir,BackupLokale EinstellungenAnwendungsdaten),dat$),1,1
endif
endif
endwhile
chdir @ADD$(Pfad$,Lokale EinstellungenAnwendungsdatenMicrosoft)
clearlist
addfiles *.*
whileloop 0, %getcount
if ListBoxItem$(&loop)=[.]
elseif ListBoxItem$(&loop)=[..]
elseif ListBoxItem$(&loop)=[Windows]
else
ifnot @Left$(ListBoxItem$(&loop),1)=[
else
dat$=@Left$(ListBoxItem$(&loop),LEN(ListBoxItem$(&loop))-1)
dat$=@Right$(dat$,LEN(dat$)-1)
Fileaction COPY,@ADD$(@ADD$(Pfad$,Lokale EinstellungenAnwendungsdatenMicrosoft),dat$),@ADD$(@ADD$($ProgDir,BackupLokale EinstellungenAnwendungsdatenMicrosoft),dat$),1,1
endif
endif
endwhile
end
Für die die es interessiert. Und many thanks für eure Hilfe....... |
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 24.06.2008 ▲ |
|
|
|