| |
|
|
| 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
|
|
|
| |
|
|
|
J. Strahl | Hallölle,
schöne Funktion die ich benutze die Userprofile auf einen Stick zu kopieren.
Leider gibt es in dem Ordner %userprofile%Lokale EinstellungenAnwendungsdatenMicrosoftWindows die Datei UsrClass.dat welche in Benutzung ist. Beimm kopieren bekomme ich die Fehlermeldung Datei kann nicht kopieren werden da sie in Benutzung ist
Gibt es eine Möglichkeit solche Dateien zu überspringen oder die die Fehlermeldung zu umgehen ? - Nach der Fehlermeldung bricht das Programm ab und der Rest wird nicht mehr kopiert.
|
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 22.06.2008 ▲ |
|
|
|
|
| Schau mal, hier stehen Flags [...] , z.B. FOF_NOCONFIRMATION oder FOF_NOERRORUI. |
|
|
| |
|
|
|
Michael Dell | Hallo,
Du könntest den Ordner Zippen die geschützten Dateien blieben dann ausen vor.
Oder Du startest den PC mit nem zweiten Betriebsystem oder ner Live-CD/DVD und kopierst den Ordner komplett.
Mit einer DOS-Startdiskette kannst Du das auch wenn Du lfn4dos und eff. ntsf4dos verwendest!
Die letzte Möglichkeit wäre die SFP (SystemFileProtection) abzuschalten, davon ist allerdings dringend abzuraten, denn das hieße direkte manipulation des Systems! |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 22.06.2008 ▲ |
|
|
|
|
| Ich glaube SystemFileProtection abschalten würde ihm hier nicht viel nutzen.
Wenn es ihm um das Auslesen der Datei geht hilft vlt. ein FileMode auf nur Lesen zu setzen.
Übrigens habe ich die Datei UsrClass.Dat nicht. (xphomesp3) |
|
|
| |
|
|
|
J. Strahl | ja, suppa - die Sache mit den Flags gefällt mir schonmal. Wichtig ist das weiterkopiert wird. Allerdings habe ich jetzt keinerlei Plan wo und wie ich jetzt irgendwo ein Flag setze.
` FOF_NOERRORUI -- Do not display a dialog to the user if an error occurs.`
Soweit klar aber den source entsprechend abändern. No Plan.. Jemand von euch ? |
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 22.06.2008 ▲ |
|
|
|
|
| |
|
| |
|
|
|
J. Strahl | oha, sorry - blutigen Anfänger.......
Case noconfirm% : Let noconfirm%=16 CaseNot norecycle% : Let norecycle%=64 Let FOF_Flag% = @or(noconfirm%,norecycle%)
Ich leite mal davon ab das dem FOF_Flag% noch was einschieben muß. Aber was ?
|
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 22.06.2008 ▲ |
|
|
|
|
| |
|
| |
|
|
|
| ich habe den oben stehenden Code in meinen NC-Clone schon vor zwei Jahren eingebaut. Die Parameter können über die zum Programm gehörende INI-Datei verstellt werden und das Ganze funktioniert perfekt |
|
|
| |
|
|
|
J. Strahl |
ne ne ne, ich weiß nicht was ich ihm geben soll. Ich habe jetzt alles gehabt, direkter Abbruch ohne Meldung. Kopieren ohne Anzeige was kopiert wird. Aber das der Fehler einfach übersprungen wird, klappt nicht. Ich weiß da nicht weiter, gehe aber davon aus das ich das eh nicht schnalle.
Ich habe in der Zeile :
Let FOF_Flag% = @or(noconfirm%,norecycle%)
einfach mal ein + 32 und verchiedene andere Möglichkeiten ausprobiert. Ich komme aber nicht auf das gewünschte Ergebniß. Ich weiß einfach nicht und habe es auch nicht finden können welcher Wert zusätzlich da rein muß.
@ Horst : Ich habe mal nach dem NC-Clone gesucht ob ich da etwas finden kann - leider konnte ich des auch nicht finden. höhö
|
|
|
| Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD | 22.06.2008 ▲ |
|
|
|
|
|
Ich habe mal nach dem NC-Clone gesucht ob ich da etwas finden kann - leider konnte ich des auch nicht finden. höhö
Wo willst Du denn da suchen ? - Dann müsstest Du schon Zugang zu meiner Festplatte haben - außer Jörg hätte noch den Code vom Beta-Test und das glaube ich nicht. So wie im Bild sieht er aus und hat den Code intregiert |
|
|
| |
|
|