AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Textfile nach änderung nachladen

Ein Thema von msickel · begonnen am 16. Sep 2009 · letzter Beitrag vom 17. Sep 2009
Antwort Antwort
msickel

Registriert seit: 14. Mai 2005
108 Beiträge
 
Delphi 2005 Professional
 
#1

Textfile nach änderung nachladen

  Alt 16. Sep 2009, 19:19
Hallo, ich möchte folgendes versuchen habe aber keinen richtigen Ansatzpunkt wie ich das umsetzten kann.

Ich möchte ein Textfile laden und dieses in Realtime überwachen, d.h wird eine Änderung im Textfile gemacht soll mein Programm die Änderung gleich anzeigen. Mit einem Memo habe ich das schon mal versucht ist aber unbrauchbar, wie kann man soetwas am geschicktesten lösen.

Auf Euere Vorschläge freue ich mich schon.
ich weiss, das ich nichts weiss!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#2

Re: Textfile nach änderung nachladen

  Alt 16. Sep 2009, 19:38
Zitat:
Mit einem Memo habe ich das schon mal versucht ist aber unbrauchbar
wie was wann wo ... und vorallem warum unbrauchbar?


Hier im Forum suchenDatei überwachen?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
msickel

Registriert seit: 14. Mai 2005
108 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Textfile nach änderung nachladen

  Alt 16. Sep 2009, 19:46
Ich habe nach dem öffnen der Datei einen Timer erzeugt und hier dann jede Sekunde das Textfile nachgeladen, hier ist es dann aber so das es stark flackert und laufend die Sanduhr kommt, zudem wird nach jedem nachladen der Cursor wieder auf den Anfang gesetzt was ein nachverfolgen der Änderungen fast unmöglich macht.
ich weiss, das ich nichts weiss!
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Textfile nach änderung nachladen

  Alt 16. Sep 2009, 19:49
.. dann vergleiche doch den Inhalt vom Memo (Memo.text)
und den Inhalt der nachgeladenen Datei (StringList.Text)
und füge nur die Unterschiede in das memo ein.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Textfile nach änderung nachladen

  Alt 17. Sep 2009, 01:54
hi,

binde diese unit ein:
Delphi-Quellcode:
unit AutoSVNNotify;

interface

uses
  Classes, Windows, StrUtils;

type
  TAutoSVNNotify = class(TThread)
  private
    sDirName: string;
    cResFilename1: string;
    cResFilename2: string;
    cResAction: Integer;
    procedure UpdateEvent();
  protected
    procedure Execute; override;
  public
    constructor Create(sDirName: string; CreateSuspended: Boolean);
  end;
  FILE_NOTIFY_INFORMATION = record
    dwNextEntryOffset: DWORD;
    dwAction: DWORD;
    dwFileNameLength: DWORD;
  end;

implementation

uses Unit1;

{ TAutoSVNNotify }

procedure TAutoSVNNotify.UpdateEvent;
begin
  if cResAction <> FILE_ACTION_RENAMED_NEW_NAME then
    cResFilename2 := '';
  Form1.UpdateEvent(cResFilename1, cResFilename2, cResAction);
end;

procedure TAutoSVNNotify.Execute;
var
  dirHandle: THandle;
  iBuf: Pointer;
  iBufWorker: Pointer;
  iBufLen: Cardinal;
  iRead: DWORD;
  FN: FILE_NOTIFY_INFORMATION;
  s: string;
begin
  dirHandle := CreateFile(PChar(sDirName), GENERIC_READ or 1, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  if (dirHandle = 0) or (dirHandle = INVALID_HANDLE_VALUE) then Exit;

  iBufLen := 65536;
  GetMem(iBuf, iBufLen);
  while not Self.Terminated do
  begin
    if not ReadDirectoryChanges(dirHandle, iBuf, iBufLen, True, FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME or FILE_NOTIFY_CHANGE_LAST_WRITE, @iRead, nil, nil) then
      Exit;

    iBufWorker := iBuf;
    repeat
      Move(iBufWorker^, FN, 12);
      s := WideCharLenToString(Pointer(Cardinal(iBufWorker) + 12), FN.dwFileNameLength);
      s := LeftStr(s, FN.dwFileNameLength div 2);
      cResAction := FN.dwAction;
      if FN.dwAction <> FILE_ACTION_RENAMED_NEW_NAME then
        cResFilename1 := s
      else
        cResFilename2 := s;

      if FN.dwAction <> FILE_ACTION_RENAMED_OLD_NAME then
        Synchronize(UpdateEvent);

      Inc(Cardinal(iBufWorker), FN.dwNextEntryOffset);
    until FN.dwNextEntryOffset = 0;
  end;
end;

constructor TAutoSVNNotify.Create(sDirName: string; CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate := True;
  Self.sDirName := sDirName;
end;

end.
und erstelle dir dann ein TAutoSVNNotify thread. inm creator stellst du direkt den pfad ein, den du überwachen willst. (also der, in dem dein textfile liegt.)

die funktion procedure TAutoSVNNotify.UpdateEvent; musst du anpassen und Form1.UpdateEvent() durch deine funktion ersetzen, an die die changes gesendet werden sollen.
cResFilename1 ist der dateiname oder der alte dateiname der datei
cResFilename2 ist der neue dateiname der datei (wird nur bei einem file rename eingesetzt)
cResAction ist die aktion

aktionen können glaub ich sein:
FILE_ACTION_REMOVED: die datei cResFilename1 wurde gelöscht
FILE_ACTION_ADDED: die datei cResFilename1 wurde neu angelegt
FILE_ACTION_MODIFIED: die datei cResFilename1 wurde geändert
FILE_ACTION_RENAMED_NEW_NAME: datei cResFilename1 wurde in cResFilename2 umbenannt
//FILE_ACTION_RENAMED_OLD_NAME [wird nie getriggert, da an dieser stelle nur cResFilename1 mit dem alten dateinamen gefüllt wird, der trigger erfolgt später bei FILE_ACTION_RENAMED_NEW_NAME, sonst wäre ja nur der alte aber nicht der neue dateiname bekannt]


was du machen musst ist also nur das verzeichnis mit der textdatei überwachen und bei jeder file_action_modified den inhalt nachladen. (natürlich werden auch für andere dateien im verzeichnis file actions übermittelt, du musst aber nur mit cresfilename1 checken, ob halt die textdatei um dies geht geändert wurde oder irgend ne andere datei)
eventuell kannst du auch die action_removed und renamed kontrollieren und den benutzer warnen oder so wenn die datei gelöscht oder "weg-umbenannt" wurde.
Dominik Weber
www.edo-soft.com
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz