![]() |
Re: Festplattenzugriffe
Das wäre eine Idee. Den Dialog kann man ja auch unsichtbar machen oder?
|
Re: Festplattenzugriffe
Ich habe es jetzt auch mal mit dieser Unit probiert:
![]() |
Re: Festplattenzugriffe
Hallo,
das geht doch ganz einfach. Windoof setzt bei jeder Änderung einer Datei das Archivierungsbit. Du erstellst eine Batchdatei mit folgendem Inhalt: xcopy quelle ziel /S /m hier wird alles kopiert was unter quelle liegt und dessen Archivierungsbit gesetzt ist. Du kannst das von Windoof automatisch durchführen lassen oder von Hand. Mag zwar primitiv aussehen ist aber enorm wirkunsvoll. /s alle subdirectories /m nur Dateien mit gesetztem Archivierungsbit /y keine Nachfrage beim Überschreiben. Beispiel
Delphi-Quellcode:
Das Ganze lässt sich auch von Delphi starten.
@echo off
xcopy e:\rcrset\*.* L:\rcrset\*.* /S /y /m Rainer |
Re: Festplattenzugriffe
Zitat:
|
Re: Festplattenzugriffe
Hallo Luckie,
ich gebe mal auch meinen Senf dazu. Ich habe mal etwas ähnliches realisiert und mit dem Löschen/öffnen ebenfalls Probleme gehabt. Ich habe es lösen können, indem ich es mehrmals versuche in einem gewissen Zeitraum. Sprich while fileExists do deleteFile + sleep. Und noch etwas, ich weiss zwar nicht welche Sambar-Version auf diesem einen Server läuft, jedoch bekomme ich keine CHange-Notification, wenn jemand anderes eine Datei dort ändert. Sprich ich musste leider auf Polling zurückgreifen. Auf einem Windows-Rechner lief es hingegen. Nur dass du diesen evtl. Fall mitbedenkst. @runger: Und danach attrib * -a? Funktioniert dann nur in Fällen, in denen selten Änderungen erfolgen. Bei ständigen Schreibzugriffen wird dir sonst der Zeitabstand xcopy -> attrib zum Verhängnis. MfG V. |
Re: Festplattenzugriffe
Es hat sich Gott sei dank erledigt. das Programm wird jetzt über den Taskplaner nachts gestartet oder eben manuell.
|
Re: Festplattenzugriffe
Hallo,
Zitat:
Das Archivierungsbit zu manipulieren ist absolut schlechter Stil. Fast alles was es an Backup-Software gibt benutzt dieses flag. Bei uns wird soetwas nicht akzeptiert. Rainer |
Re: Festplattenzugriffe
Ich hab z.B. ein winziges Progie, welches in Dateien den Zeilenumbruch an das im Windows übliche #13#10 anpaßt, dabei werden ja das Archivattribut, sowie das Anderungsdatum der Datei geändert, allerdings ändert sich ja nicht "wirklich" was am Dateiinhalt, daher setze ich z.B. in diesem Fall diese Werte wieder zurück, damit ich den tatsächlichen, "inhaltlichen" Zustand der Datei noch an diesen Werten erkennen kann :zwinker:
|
Re: Festplattenzugriffe
So, dann mach ich auch mal mit ... irgendwas stimmt wohl wirklich mit den Befehlen nicht.
In diesem Code (ist im Grunde vom Aufbau her wie der Erste hier im Thread) reagiert Find*ChangeNotification/WaitForSingleObject sehr oft auf Änderungen (aber auch nicht immer), wobei ReadDirectoryChangesW entweger garnichts zurückgibt und die Ausführung dort zum Stehen kommt, oder ebenfalls nur die letzte Änderung ankommt.
Delphi-Quellcode:
Probleme mit dem Dateizugriff sollte es nicht geben, da hier nicht auf die Dateien zugegriffen wird, dieses würde erst Zeitversetzt ein einem anderem Thread geschehen.
Function DCSourceChangesThread(DC: TDirectoryCompare): LongWord; StdCall;
Const BufferSize = 4096{65536}; Var DH, NH: THandle; Buffer, P: PWideChar; Name: Widestring; Status: TDCObjStatus; i: Integer; W: LongWord; Label LExit; Begin Result := 0; DH := CreateFileW(PWideChar(Copy(DC._SourceRoot, 1, Length(DC._SourceRoot) - 1)), GENERIC_READ or FILE_LIST_DIRECTORY, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); NH := FindFirstChangeNotificationW(PWideChar(Copy(DC._SourceRoot, 1, Length(DC._SourceRoot) - 1)), True, FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME or FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_CREATION); Buffer := GetMemory(BufferSize); If (DH <> INVALID_HANDLE_VALUE) and (NH <> INVALID_HANDLE_VALUE) and (Buffer <> nil) Then Repeat If (DC._DestChangesThread = INVALID_HANDLE_VALUE) or (DC._Pause = 2) Then GoTo LExit; Case WaitForSingleObject(NH, 1000) of WAIT_FAILED: Break; WAIT_OBJECT_0: If ReadDirectoryChangesW(DH, Buffer, BufferSize, True, FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME or FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_CREATION, @W, nil, nil) Then Begin P := Buffer; Repeat SetLength(Name, PFileNotifiInformation(P)^.FileNameLength div 2); Move(PFileNotifiInformation(P)^.FileName, Name[1], PFileNotifiInformation(P)^.FileNameLength + 1); Case PFileNotifiInformation(P)^.Action of FILE_ACTION_ADDED: Status := [dcsDeleted]; FILE_ACTION_REMOVED: Status := [dcsCreated]; FILE_ACTION_MODIFIED: Status := [dcsSize..dcsLastWriteTime, dcsContent..dcsAttrEncrypted]; FILE_ACTION_RENAMED_OLD_NAME: Status := [dcsName]; FILE_ACTION_RENAMED_NEW_NAME: Status := [dcsName]; Else Status := [dcsSize..dcsAttrEncrypted]; End; Lock(DC._Lock); i := High(DC._SourceChangesList); While i >= 0 do If WideSameText(DC._SourceChangesList[i].Name, Name) Then Break Else Dec(i); If i < 0 Then Begin i := Length(DC._SourceChangesList); SetLength(DC._SourceChangesList, i + 1); DC._SourceChangesList[i].Name := Name; //UniqueString(DC._SourceChangesList[i].Name); // WideString/OLE-String is always an UniqueString. DC._SourceChangesList[i].Changes := []; End; DC._SourceChangesList[i].Changes := DC._SourceChangesList[i].Changes + Status; DC._SourceChangesList[i].Time := GetTickCount; Unlock(DC._Lock); P := Buffer + PFileNotifiInformation(P)^.NextEntryOffset; Until PFileNotifiInformation(P)^.NextEntryOffset = 0; End Else Break; End; Until not FindNextChangeNotification(NH); DC._CallStatusProc(dcsErrorSourceDirChangesThread, '', Integer(DC)); LExit: FreeMemory(Buffer); FindCloseChangeNotification(NH); CloseHandle(DH); LockedSet(DC._SourceChangesThread, INVALID_HANDLE_VALUE); End; |
Re: Festplattenzugriffe
Hi,
da ich grade auch an so einem Problem stehe und ich mir den Code von Christian mal ansah... Es ist ja schon interessant was so alles geschieht selbst wenn man glaubt der Rechner ist in Idle-Mode! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz