Irgendwie ist das ziemlich unnütz, erst die Daten in eine Datei zu speichern, diese wieder auszulesen und anschließend die Datei zu löschen.
Das Gleiche erreicht man auch so:
Irgendwie ist das ziemlich unnütz, erst die Daten in eine Datei zu speichern, diese wieder auszulesen und anschließend die Datei zu löschen.
Das Gleiche erreicht man auch so:
Ich möchte wenn Person X / Programm Y etwas in eine Datei schreibt, dass PC Z eine MSGBOX erhält.
Beschreib mal das Problem genauer!
Wie viele Rechner sind da beteiligt? Wo liegen die Dateien? Wie viele Personen/Programme greifen da (gleichzeitig?) drauf zu?
Welcher Rechner soll wann eine MsgBox erhalten? Und was soll da drin stehen?
Es gibt da nämlich einen schönen Befehl "_WinAPI_ShellChangeNotifyRegister", womit man ein Verzeichnis überwachen kann.
Wenn Du AutoIt "raten" lässt (ohne Angabe des Dateiformats), um welches Dateiformat es sich handelt, so kann das schonmal schief gehen.
Bei einer reinen ASCII-Datei mag das ja noch klappen, aber sobald eine Zeichenkonvertierung ins Spiel kommt, würde ich immer mit FileOpen und dem Handle arbeiten.
Lötpumpe und Lötband (saugt das irgendwie auf und heißt anders aber Name vergessen)
Nur der Vollständigkeit halber:
- Entlötsaug-Pumpe
- Entlötsaug-Litze
Ich bevorzuge die Pumpe.
Wichtig ist beim löten, dass die Lötstelle anschließend schön silbern glänzt.
Sieht die Lötstelle hingegen matt aus, handelt es sich sehr wahrscheinlich um eine "kalte" Lötstelle (leitet nicht korrekt/Wackelkontakt).
Naja, es geht schon einfacher, weil meine Funktion auch die Rückgabe als String zulässt und man so erstmal alles in einen String einlesen und am Schluß dann das Array erstellen lassen kann.
Hier mal als Beispiel:
#include <Array.au3>
Global $sFiles = '', $aFiles
Global $iTimer = TimerInit()
Global $aDrives = DriveGetDrive('FIXED')
If Not @error Then
For $i = 1 To $aDrives[0]
ToolTip('Lese Laufwerk: "' & $aDrives[$i] & '" - Bitte warten...')
$sFiles &= _RecursiveFileListToArray($aDrives[$i], '.*', 1, 0)
Next
$aFiles = StringSplit(StringTrimRight($sFiles, 2), @CRLF, 1)
EndIf
ConsoleWrite('Zeit (ms): ' & TimerDiff($iTimer) & @CR)
ToolTip('')
_ArrayDisplay($aFiles)
;===============================================================================
; Function Name: _RecursiveFileListToArray($sPath[, $sPattern][, $iFlag][, $iFormat][, $fRecursion][, $sDelim])
; Description:: gibt Verzeichnisse (rekursiv) und/oder Dateien zurück, die einem RegExp-Pattern entsprechen
; Parameter(s): $sPath = Startverzeichnis
; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
; $iFlag = Auswahl
; 0 = Dateien & Verzeichnisse
; 1 = nur Dateien
; 2 = nur Verzeichnisse
; $iFormat = Rückgabeformat
; 0 = String
; 1 = Array mit [0] = Anzahl
; 2 = Nullbasiertes Array
; $fRecursion = Verzeichnisse rekursiv durchsuchen
; False = Nein
; True = Ja
; $sDelim = Trennzeichen für die String-Rückgabe
; Requirement(s): AutoIt 3.3.0.0
; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
; Author(s): Oscar (www.autoit.de)
; Anregungen von: bernd670 (www.autoit.de)
; und: AspirinJunkie (www.autoit.de)
;===============================================================================
Func _RecursiveFileListToArray($sPath, $sPattern = '.*', $iFlag = 0, $iFormat = 1, $fRecursion = True, $sDelim = @CRLF, $fOpenDLL = True)
Local $hSearch, $sFile, $sReturn = '', $aD
Local Static $hDll
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$hSearch = FileFindFirstFile($sPath & '*')
If Not @error And $hSearch <> -1 Then
If $fOpenDLL Then $hDll = DllOpen('kernel32.dll')
While True
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Then
$aD = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFile)
If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
If $fRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0, True, $sDelim, False)
ContinueLoop
EndIf
If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
WEnd
FileClose($hSearch)
If $fOpenDLL Then DllClose($hDll)
EndIf
If $iFormat = 2 Then $iFormat = 3
If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
Return $sReturn
EndFunc
Alles anzeigen
Wichtiger Hinweis: _ArrayDisplay zeigt nur die ersten 65525 Einträge an. Es sind aber alle Dateien im Array enthalten!
Auf meinem PC sind's 30 FPS.
CPU: Intel Core i5-4690 @ 3.5 GHz
GPU: AMD Radeon HD 5770
Das war's bestimmt nicht!
Welches Programm? Welcher Text? Welche Internetseite? Wo ist Dein Script?
Wobei man für die aktuelle AutoIt-Version bei der au3-Datei einige Änderungen vornehmen muss:
- die Funktionen "_WinAPI_RemoveFontMemResourceEx" und "_WinAPI_AddFontMemResourceEx" auskommentieren.
- die Variable "$ghGDIPDll" gegen "$__g_hGDIPDll" austauschen.
Ein RasPi ist dafür sowieso Overkill.
Ein "Arduino Nano" zum Beispiel würde völlig reichen oder (wegen Netzwerk und wenn WLAN ok ist) lieber einen ESP8266.
Ansonsten gibt es für den Arduino auch Netzwerk-Module.
Lottich: Du musst Dich gar nicht angegriffen fühlen. Deine "Lösung" mit Switch...Case könnte durchaus viel besser sein.
Es geht in erster Linie gegen den TE, der nicht in der Lage ist, das eigentliche Problem zu schildern. Wir raten und basteln an seinem Beispiel herum.
Ich denke aber, dass das eigentliche Problem viel einfacher zu lösen wäre, wenn wir es denn jemals erfahren werden...
Jedenfalls habe ich bei meinen Programmen noch nie ein "geschaltetes NOT" benötigt. Mir fällt auch kein Anwendungsfall dafür ein.
Schon allein deswegen würde mich das eigentliche Problem interessieren.
Das ist doch mal wieder das typische X-Y-Problem!
Hier wird an Y herumgedoktert ohne das X zu kennen.
So nebenbei ist auch die Abfrage der Checkboxen falsch.
Aber macht ruhig so weiter...
jedoch hätte ich Dir selbst auch gerne eine kleine Summe für Deine Mühe überwiesen.
Das ist nicht nötig!
Ich programmiere gern in AutoIt und solche kleinen Programme sind dann eine gute Übung.
Deine Spende an das Forum ist als Gegenleistung völlig ausreichend. Davon profitiere ich indirekt (durch den Erhalt dieses Forums) ja auch.
So, ich habe das Programm fertig (siehe Anhang)!
Das ist jetzt gleich ein komplettes Programm geworden (inkl. GUI). Das Script ist auch vollständig kommentiert.
Du musst noch die Quell- und Zielverzeichnisse anpassen!
Und weil Du es ja auf der Arbeit einsetzen willst, wäre es schön, wenn Du als Gegenleistung dem Forum eine Spende zukommen lassen könntest.
kennt jemand eine andere lösung ?
Eine andere Lösung, wofür?
Deine obigen Codezeilen ergeben keinen Sinn. Was willst Du erreichen?
Heute habe ich keine Zeit mehr dafür!
Vielleicht morgen. Falls nicht jemand anderes sich findet. ![]()
Ist der Rest vom Code soweit ok oder sollte ich noch etwas berücksichtigen?
Nein, so wird das nichts! Du kannst dort nicht einfach Quell- und Zielverzeichnis eintragen.
Du musst alle Dateien im Quellverzeichnis einlesen und dann in einer Schleife einzeln überprüfen, ob sie "in Benutzung" sind.
Wenn "nein", dann kopieren/verschieben. Wenn "ja", dann erst beim nächsten (nach 2 Minuten) Schleifendurchlauf bearbeiten.
Es muss also zwei ineinander verschachtelte Schleifen geben. Die äußere ist die "Zeitschleife" und die innere bearbeitet alle Dateien im Quellverzeichnis.
Wie soll denn der Teil nach der While-Schleife ausgeführt werden?
Für das löschen nach X Tage habe ich mal eine Funktion geschrieben:
#include <Date.au3>
_FileDeleteAfterXDays('c:\Temp\', 10) ; alle Dateien in "c:\temp\", die älter als 10 Tage sind, löschen.
;===============================================================================
; Function Name: _FileDeleteAfterXDays($sPath, $iDays[, $bForceDel][, $bRek][, $bDirDel][, $bLog])
; Description:: löscht Dateien in einem ausgewähltem Verzeichnis (rekursiv)
; nach einer angegebenen Anzahl von Tagen
; Parameter(s): $sPath = Verzeichnis, aus dem die Dateien gelöscht werden sollen.
; $iDays = Dateien, die älter als $iDays (in Tagen) sind, löschen.
; $bForceDel = wenn "True" werden auch Dateien/Verzeichnisse gelöscht,
; die gegen löschen geschützt sind ("R"-Attribut)
; $bRek = wenn "True" wird das Verzeichnis rekursiv (inkl. Unter-
; verzeichnisse) durchsucht.
; $bDirDel = wenn "True" wird das Unterverzeichnis gelöscht, wenn
; es (aufgrund der Löschaktion) leer ist.
; $bLog = wenn "True" wird das Ergebnis der Löschaktion in die
; Console geschrieben.
; Requirement(s): AutoIt-Version v3.3.14.2
; #include <Date.au3>
; Return Value(s): bei Erfolg Rückgabe = 1
; bei Fehler Rückgabe = 0
; und @error:
; 1 = $iDays ist keine oder eine negative Zahl
; 2 = Das übergebene Verzeichnis existiert nicht oder ist leer.
; Author(s): Oscar (www.autoit.de)
; Micha_he (www.autoit.de)
;===============================================================================
Func _FileDeleteAfterXDays($sPath, $iDays, $bForceDel = False, $bRek = False, $bDirDel = False, $bLog = True)
Local $hSearchm, $hEmpty, $sFile, $sDate, $iRet
If (Not IsNumber($iDays)) Or ($iDays < 0) Then Return SetError(1, 0, 0)
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$hSearch = FileFindFirstFile($sPath & '*.*')
If @error Then Return SetError(2, 0, 0)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Then
If $bRek Then
_FileDeleteAfterXDays($sPath & $sFile, $iDays, $bForceDel, $bRek, $bDirDel, $bLog)
If $bDirDel Then
$hEmpty = FileFindFirstFile($sPath & $sFile & '\*.*')
If @error Then
If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
$iRet = DirRemove($sPath & $sFile)
If $bLog Then ConsoleWrite('Folder "' & $sPath & $sFile & '" deleted = ' & ($iRet ? 'yes' : 'no') & @CR)
EndIf
FileClose($hEmpty)
EndIf
EndIf
Else
$sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 0, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
If _DateDiff('D', $sDate, _NowCalc()) > $iDays Then
If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
$iRet = FileDelete($sPath & $sFile)
If $bLog Then ConsoleWrite('File "' & $sPath & $sFile & '" deleted = ' & ($iRet ? 'yes' : 'no') & @CR)
EndIf
EndIf
WEnd
FileClose($hSearch)
Return 1
EndFunc ;==>_FileDeleteAfterXDays
Alles anzeigen
Zu "_WinAPI_FileInUse": Den Befehl musst Du doch nur in einer If-Anweisung vor FileCopy benutzen:
If Not _WinAPI_FileInUse($sSource) Then FileCopy($sSource, $sDest)
Den abteillungsweise Netzwerkordner alle 30 Tage leeren ab Scriptstart habe ich noch keine Idee. Event. wisst ihr wie das gehen könnte.
Die Dateien bekommen doch automatisch ein Erstellungsdatum. Somit einfach alle Dateien, die älter sind als 30 Tage löschen.
Wie kann ich bwerkstelligen, dass erst dann, wenn die Scandatei im Verteiler-PC fertiggestellt ist, in den Abteilungsordner verschoben und dem Benutzer sichtbar angezeigt wird.
Diese Dateien sind "in Benutzung" (es liegt ein Datei-Lock darauf).
Das kannst Du mit "_WinAPI_FileInUse" abfragen und nur wenn die Datei nicht mehr "in Benutzung" ist, lässt Du die Datei kopieren/verschieben.