Beiträge von Oscar
-
-
Was willst Du denn mit den Archiven machen?
Das Array $aDirs enthält alle Unterordner von 'c:\beispiel\test\'. Kopiert und gepackt werden aber nur die, die auch die zwei Textdateien enthalten. Demzufolge könnte es sein, dass es einige Archive mit $aDirs[x] nicht gibt.
Je nachdem, was Du vorhast, würde es sich vielleicht anbieten, die ZIP-Archive in ein eigenes Array einlesen zu lassen. -
Das sieht auf jeden Fall schon sehr gut aus.
Gleich mal in mein Archiv aufnehmen... -
Zitat
Kann ein Mod das vll ins Projekte Forum verschieben

Wird ja ein Projekt , was ich immer verbessere !Ich hab's nach Projekte verschoben.
-
Doch, AutoBert hat recht. Die Funktion von BugFix kann auch ganze Verzeichnisse packen. Da habe ich mich geirrt (Sorry, BugFix).
Ich habe die Funktion mal in mein Beispiel eingebunden:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <File.au3>$sPath = 'c:\beispiel\test\'
[/autoit] [autoit][/autoit] [autoit]
$sFile1 = 'datei1.txt'
$sFile2 = 'datei2.txt'
$aDirs = _FileListToArray($sPath, '*', 2) ; das Array $aDirs enthält die Namen der Unterverzeichnisse von $sPath
If Not @error Then
For $i = 1 To $aDirs[0] ; alle gefundenen Unterverzeichnisse durchgehen
If FileExists($sPath & $aDirs[$i] & '\' & $sFile1) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile1, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
If FileExists($sPath & $aDirs[$i] & '\' & $sFile2) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile2, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
If FileExists(@TempDir & '\' & $aDirs[$i]) Then _BuildInZIP(@TempDir & '\' & $aDirs[$i] & '.zip', @TempDir & '\' & $aDirs[$i] & '\')
Next
EndIf;===============================================================================
[/autoit]
; Function Name: _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=True, $iIndexBase=1, $fOverwrite=True)
; Description: Erstellt aus einer Datei od. einem Array von Dateien eine ZIP-Datei
; mit Hilfe der Windows eigenen ZIP-Funktion
; Parameter(s): $sPath Pfad der zu erstellenden ZIP-Datei // Bestehenden ZIP-Datei
; $s_a_ToZip String der Einzeldatei oder Array der zu zippenden Dateien
; // Pfad des Zielordners, in den entpackt werden soll
; $fUnZip=True Entpacken=True, Packen=False (Standard)
; $iIndexBase Index Basis (erstes Element mit Pfad) des übergebenen Arrays (0 od.1)
; $fOverwrite Falls $sPath existiert ==> Überschreiben (Standard=True)
; Return Value(s): Erfolg 1
; Fehler set @error 1 - Überschreiben aus, aber Zieldatei existiert
; 2 - Zieldatei endet nicht auf ".zip"
; 3 - zu komprimierende Datei existiert nicht
; @extended: Anzahl der fehlenden Dateien
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=False, $iIndexBase=1, $fOverwrite=True)
Local $fh, $sNul = '', $sZIPHeader, $objShell = ObjCreate("Shell.Application"), $objZipOrdner, $err = 0
$sPath = FileGetLongName($sPath, 1)
If $fUnZip Then
Local $temp, $objZip
If Not FileExists($s_a_ToZip) Then DirCreate($s_a_ToZip)
$temp = $objShell.Namespace($s_a_ToZip)
$objZip = $objShell.Namespace($sPath)
$temp.CopyHere($objZip.Items)
Return 1
EndIf
If (Not $fOverwrite) And FileExists($sPath) Then Return SetError(1,0,0)
If StringRight($sPath, 4) <> '.zip' Then Return SetError(2,0,0)
For $i = 1 To 18
$sNul &= Chr(0)
Next
$sZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & $sNul
$fh = FileOpen($sPath, 10)
FileWrite($fh, $sZIPHeader)
FileClose($fh)
$objZipOrdner = $objShell.Namespace($sPath)
If Not IsArray($s_a_ToZip) Then
If Not FileExists($s_a_ToZip) Then Return SetError(3,1,0)
$objZipOrdner.CopyHere($s_a_ToZip)
Sleep(1000)
Return 1
EndIf
For $i = $iIndexBase To UBound($s_a_ToZip) -1
If Not FileExists($s_a_ToZip[$i]) Then
$err += 1
ContinueLoop
EndIf
$objZipOrdner.CopyHere($s_a_ToZip[$i])
Sleep(1000)
Next
If $err Then Return SetError(3,$err,0)
Return 1
EndFunc ;==>_BuildInZIP
So brauchst Du dann auch die 7z.dll und 7z.exe nicht mehr. -
Vielleicht ein Bug in der GDI+ UDF?
Auf jeden Fall funktioniert es mit dem doppelten Befehl, deshalb auch [gelöst].
-
_FileListToArray liefert nicht den kompletten Pfad der Dateien zurück, sondern nur die Datei-/Verzeichnisnamen.
-
-
-
-
Mist! Da waren noch ein paar kleine Fehler (man sollte das Skript auch testen).

So klappt es aber (getestet):
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <File.au3>$sPath = 'c:\beispiel\test\'
[/autoit]
$sFile1 = 'datei1.txt'
$sFile2 = 'datei2.txt'
$aDirs = _FileListToArray($sPath, '*', 2) ; das Array $aDirs enthält die Namen der Unterverzeichnisse von $sPath
If Not @error Then
For $i = 1 To $aDirs[0] ; alle gefundenen Unterverzeichnisse durchgehen
If FileExists($sPath & $aDirs[$i] & '\' & $sFile1) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile1, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
If FileExists($sPath & $aDirs[$i] & '\' & $sFile2) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile1, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
Next
EndIf -
Den Anfang würde ich so machen:
Spoiler anzeigen
[autoit]
[/autoit]
#include <File.au3>
$sPath = 'c:\beispiel\test\'
$sFile1 = 'datei1.txt'
$sFile2 = 'datei2.txt'
$aDirs = _FileListToArray($sPath, '*', 2) ; das Array $aDirs enthält die Namen der Unterverzeichnisse von $sPath
If Not @error Then
For $i = 1 To $aDirs[0] ; alle gefundenen Unterverzeichnisse durchgehen
If FileExists($sPath & $aDirs[$i] & '\' & $sFile1) Then FileCopy($sPath & $aDirs[$i] & $sFile1, @TempDir & $aDirs[$i] & '\' & $sFile1) ; wenn die Datei existiert nach TempDir kopieren
If FileExists($sPath & $aDirs[$i] & '\' & $sFile2) Then FileCopy($sPath & $aDirs[$i] & $sFile1, @TempDir & $aDirs[$i] & '\' & $sFile2) ; wenn die Datei existiert nach TempDir kopieren
Next
EndIf -
Jetzt bin ich völlig verwirrt. :wacko:
[autoit]
Ich habe diesen Befehl:_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 50, 110, $iWidth, 44)
[/autoit]einfach noch ein zweites Mal darunter geschrieben, sodass der jetzt zweimal identisch hintereinander steht:
[autoit]
[/autoit]
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 50, 110, $iWidth, 44)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 50, 110, $iWidth, 44)
und jetzt ist der Grafikfehler weg.
Edit: Mahagon: Kannst Du bestätigen, dass der Grafikfehler mit der doppelten Zeile nicht mehr auftritt?
-
Hab's jetzt auch mal auf meinem WindowsXP-Rechner (32 Bit) ausprobiert. Da tritt der Fehler auch nicht auf.
Scheint an Win7 (64 Bit) zu liegen...
-
Das Skript ist bisher erstmal nur zur Grundlagen-Forschung.

Bei Dir tritt der Fehler nicht auf? Hast Du auch ganz genau hingeschaut? Das ist ja immer nur kurz zu erkennen.
Aber wenn der wirklich nicht auftritt, würde mich mal Deine Konfiguration (Windows, 32 oder 64 Bit, AutoIt-Version) interessieren. -
Ich wollte mal etwas mit GDI+ und der BASS.dll rumspielen und habe ein Levelmeter erstellt. Dieses wird mit _GDIPlus_GraphicsFillRect gefüllt.
Allerdings tritt dort ein kleiner Grafikfehler auf:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
Und den kann ich mir eigentlich nicht erklären. Für den Screenshot musste ich einige Versuche unternehmen, weil der Fehler scheinbar nicht immer auftritt.
Vielleicht hat ja einer von euch eine Erklärung dafür...Zum ausprobieren habe ich mal das Skript und die benötigten Bass-Dateien gepackt (Anhang).
-
Vielleicht so:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>$left = 600
[/autoit] [autoit][/autoit] [autoit]
$top = 300
$hGui = GUICreate('Test', 200, 100, $left, $top)
GUISetState()
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')Do
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3Func WM_MOVE($hWnd, $Msg, $wParam, $lParam)
[/autoit]
WinMove($hGui, '', $left, $top)
EndFunc -
Nicht gleich so aufbrausend werden.
Es könnte passieren und genau deswegen gibt es diese Warnmeldungen. Wie Du bemerkt hast, funktioniert Dein Skript trotzdem (nach ignorieren der Warnmeldungen), aber es ist ein schlechter Programmierstil (da hat Dax schon recht). -
War das nicht schon immer so? Kann mich jetzt nicht erinnern...
Wenn Dir das im Hauptprogramm zu unübersichtlich wird, kannst Du die Variablendeklaration auch in einer extra au3-Datei machen und diese dann in Deinem Programm includen.
Man könnte sich dafür auch ein Skript schreiben...
-
Globale Variablen musst Du auch Global (im Hauptprogramm) deklarieren und nicht in einer Funktion.
Das sollen Dir diese Warnmeldungen sagen.