Deutsch
Quelltexte/ Codesnippets

Shfileoperation

 
- 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:

KompilierenMarkierenSeparieren
Def @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
 
07.03.2005  
 



 
- Seite 2 -


Er brauch einen Code, kein Bild
 
22.06.2008  
 




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
 
23.06.2008  
 



Ich schrieb doch oben schon
iF
Vom Code oben:
KompilierenMarkierenSeparieren
Word opstruct#,16=FOF_Flag% | ~FOF_NOERRORUI


Einfach Word opstruct#,16=FOF_Flag% | ~FOF_NOERRORUI hier weitere anhängen | blub | brab |solali

FOF_Flag% kannst Du unangefasst lassen.
 
23.06.2008  
 




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.
 
23.06.2008  
 




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
 
23.06.2008  
 




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
KompilierenMarkierenSeparieren
Def 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.
KompilierenMarkierenSeparieren
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  
 




Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

6.692 Betrachtungen

Unbenanntvor 0 min.
Andre Rohland31.05.2019
supernova04.12.2013
Christian Hahn05.07.2013

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie