Ich hab es durchaus mit deiner Abfrage mit waModified probiert aber hat bei Änderungen nicht reagiert bzw. soll sich ja explizit auf die vorher erstellte datei beziehen. Daher bin ich dafür wieder auf die Timerlösung umgestiegen. Wobei ich dort aktuell das Problem habe, das ich mit der Zeitausgabe nicht hinkomme (falsche Zeit, ich denke immer die aktuelle Systemzeit). Die Funktion habe ich allerdings nur kopiert und mich irritiert das Systemtime bei Encodedate.
function TTools.GetCreationTimeOfFile(const AFileName: String): TDateTime;
var
SR: TSearchRec;
SystemTime: TSystemTime;
NewWriteTime: TFileTime;
begin
Result:=0;
if FindFirst(AFileName, faAnyFile, SR)=0 then
try
IF (FileTimeToLocalFiletime(SR.FindData.ftLastWriteTime, NewWriteTime) and
FileTimeToSystemTime(NewWriteTime, SystemTime)) Then
Result := Encodedate(SystemTime.wYear,
SystemTime.wMonth,
SystemTime.wDay) +
Encodetime(SystemTime.wHour,
SystemTime.wMinute,
SystemTime.wSecond,
SystemTime.wMilliseconds);
finally
FindClose(SR)
end;
end;
Ich hab es durchaus mit deiner Abfrage mit waModified probiert aber hat bei Änderungen nicht reagiert bzw. soll sich ja explizit auf die vorher erstellte datei beziehen.
Warum waAdded wenn ich schauen möchte ob eine Datei geändert/bearbeitet wurde? bei Added wäre ich bei erstellt oder hineinkopiert (das überwachen davon funktioniert ja schon dank deiner Hilfe). Oder verstehe ich da etwas falsch.
Bin bei Step 2: Schauen ob die erstellte Datei sich in den letzten 30sekunden gändert hat/ bearbeitet wurde.
Macht ja nix Dennoch habe ich das oben genannte Problem mit der Zeit/Systemzeit. Auch kann ich "NewWriteTime" nicht umwandeln, bin da noch auf einer Lösungssuche.
function TTools.GetFileChange(const AFileName: String): TDateTime;
var
SR: TSearchRec;
SystemTime: TSystemTime;
NewWriteTime: TFileTime;
begin
Result:=0;
if FindFirst(AFileName, faAnyFile, SR)=0 then
try
IF (FileTimeToLocalFiletime(SR.FindData.ftLastWriteTime, NewWriteTime) and
FileTimeToSystemTime(NewWriteTime, SystemTime)) Then
Result := filetimetodatetime(newwritetime);
finally
FindClose(SR);
end;
end;
Function TTools.FileTimeToDateTime(Const TimeIn : _FILETIME) : tDateTime;
Var
DosTime : Cardinal;
Date : Word;
Time : Word;
Begin
FileTimeToDosDateTime(@TimeIn, Date, Time);
DosTime := Cardinal(Date) Shl 16 + Time;
Result := FileDateToDateTime(DosTime);
End;
Jetzt bekomme ich allerdings das "Erstellungsdatum/Zeit" der Datei.
Edit: Lösung gefunden Manchmal muss man seine eigene Logik in Frage stellen XD
function GetFileLastWriteTime(Path: string; var LastWrite : TDateTime): Boolean; var
hFile: THandle;
rStructur: TWin32FindData;
rFileTime: TFileTime;
dwLastWrite: Cardinal; begin
Result := False;
hFile := Winapi.Windows.FindFirstFile(pchar(Path), rStructur); if hFile <> INVALID_HANDLE_VALUE thenbegin
Winapi.Windows.FindClose(hFile); { FILETIME in lokales FILETIME-Format konvertieren }
FileTimeToLocalFileTime(rStructur.ftLastWriteTime, rFileTime); { lokales FILETIME-Format ins DOS-Format konvertieren }
FileTimeToDosDateTime(rFileTime, LongRec(dwLastWrite).Hi, LongRec(dwLastWrite).Lo); { DOS-Format in ein Delphi-Format konvertieren }
LastWrite := FileDateToDateTime(dwLastWrite);
Result := True; end; end;
procedure TForm1.FormCreate(Sender: TObject); var
DT: TDateTime; begin if GetFileLastWriteTime(ParamStr(0), DT) then Label1.Caption := DateTimeToStr(DT); end;
ich muss mal an mein Thema hier wieder anknüpfen.
Ich habe die Tage gezwungener Maßen Lazarus neuinstalliert (neue OS Installation) und daher die neueste Version genommen.
Leider habe ich nun ein Problem, wo ich partout nicht weiter komme.
Wenn ich eine Kopier Routine starte und damit auch eine Überwachung einer Datei funktioniert zunächst erst alles einwandfrei.
Wenn die Routine abgeschlossen ist und erneut (für den gleichen Ordner) gestartet wird erhalte ich eine Zugriffsverletzung (2ndRun.jpg), leider keine Debuggerausgabe .
Ich vermute das ich vergessen habe irgendeinen Zugriff/Thread oder so zu schließen, komme aber nicht drauf.
Hier der betreffende Code: (ich hoffe ich habe nichts vergessen):
procedure TTools.KopierenClick(Sender: TObject); var
buttonSelected : Integer;
PfadA, PfadB : WideString;
i : Integer; begin
Fail.Clear;
Timer3.Interval := strtoint(Delay.Text) * 1000;
if (Programs.itemindex >= 0) and
(Programs.Items[Programs.itemindex] <> '.') then begin if (Data.itemindex >= 0) and
(split(Data.items[Data.itemindex],'.',1) = 'exe') then begin if SysUtils.DirectoryExists(KopierenE.Text + Programs.items[Programs.itemindex]) then begin if DatenC.Checked then begin
StartCopy(); endelseif OriginalE.text <> InstallE.Text then begin
buttonSelected := messagedlg('Das Programm existiert bereits im Installationsordner. Überschreiben?',mtCustom, [mbYes,mbCancel], 0); if buttonSelected = mrYes then begin
StartCopy(); end; endelse begin
StartCopy(); end; endelse begin
StartCopy(); end;
LastList.LoadFromFile(KopierenE.Text + Programs.items[Programs.itemindex] + '\test.txt');
Last.Enabled := True; endelseif HinweisC.Checked = False then begin
showmessage('Es wurde keine Exe gewählt.'); end;
endelseif HinweisC.Checked = False then begin
showmessage('Es wurde kein Programm gewählt.'); end; end;
//Kopieren starten procedure TTools.StartCopy(); var
Status : Bool; begin
delete(Widestring(KopierenE.Text + Programs.items[Programs.itemindex]));
Status := copydir(PfadP + WideString(Programs.items[Programs.itemindex]), WideString(KopierenE.Text)); if Status then begin
sFileAction := 'Create';
Kopieren.Enabled := False;
NewLog(Widestring(KopierenE.Text + Programs.items[Programs.itemindex]));
Progress.Visible := True;
Progress.Position:= 0;
ProgressTimer.Enabled := True; if StartP.checked then begin
startasUser(WideString(KopierenE.Text + Programs.items[Programs.itemindex] + '\' + Data.items[Data.itemindex]), KopierenE.Text + Programs.items[Programs.itemindex] + '\'); endelse begin
Run.Enabled := True; end; end; end;
//Prozess als bestimmten Benutzer starten (Hilfsaufruf) procedure TTools.startasUser(exe: Widestring; param: string); var
User : WideString;
PW : WideString;
err : DWORD; begin
User := 'Test';
PW := 'PW';
err := CreateProcessAsLogon(User, PW, exe, WideString(param), ''); if err <> 0 then begin
ShowMessage(SysErrorMessage(err)); end; end;
function TTools.CreateProcessAsLogon(const User, PW, Application, param, CmdLine: WideString): DWORD; var
ws : WideString;
si : TStartupInfoW;
pif : TProcessInformation; begin
ZeroMemory(@si, sizeof(si));
si.cb := sizeof(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := 1;
if CmdLine = '' then begin
ws := Application; endelse begin
ws := Application + ' "' + CmdLine + '"'; end;
SetLastError(0);
SI.cb := SizeOf(TStartupInfo); if CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(ws), CREATE_DEFAULT_ERROR_MODE, nil, PWideChar(param), @si, @pif) then begin
sleep(500); if PIf.dwProcessId > 0 then begin
AppPID := PIf.dwProcessId;
CloseHandle(PIf.hProcess);
CloseHandle(PIf.hThread); end; end;
Result := GetLastError; end;
procedure TTools.OnNotifySynchronized(); begin
Timer3.Enabled := true; end;
procedure TTools.OnNotify(const FilePath: WideString; const Action: TDirectoryEventType); var
start, i : integer;
FileName : WideString; begin
FileName := '';
start := 1; for i := length(FilePath) downto 1 do begin if FilePath[i] = '\' then begin
start := i + 1;
break; end; end;
for i := start to length(FilePath) do begin
FileName := FileName + FilePath[i]; end;