AGB  ·  Datenschutz  ·  Impressum  







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

Aktualisierung erzwingen

Ein Thema von Carsten1234 · begonnen am 15. Jan 2009 · letzter Beitrag vom 22. Okt 2009
Antwort Antwort
Seite 1 von 3  1 23      
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#1

Aktualisierung erzwingen

  Alt 15. Jan 2009, 12:07
Hallo,

auf/in einem über USB angeschlossenen Gerät wird eine Textdatei (Log-Datei) ausgelesen und in einem TMemo angezeigt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var FIn : System.Text;
    Line: string;
begin
  Memo1.Lines.Clear;
{$I-}
  System.AssignFile(FIn, FileListBox1.FileName);
  System.Reset(FIn);
{$I+}
  if System.IOResult = 0 then
  begin
    while not(EoF(Fin)) do
    begin
      System.Readln(FIn, Line);
      Memo1.Lines.Add(Line);
    end;
    System.CloseFile(FIn);
  end;
end;
Diese Textdatei wird ausschließlich vom USB-Gerät selbst manipuliert (verändert), auf PC-Seite soll diese Datei immer nur lesend geöffnet werden.
Problem: Windows bekommt eine Aktualisierung nicht mit und auch wenn ich wie oben geschrieben die Datei immer wieder neu öffne und schließe, so ist der mir angezeigte Inhalt derselbe. Ziehe ich hingegen das Gerät ab und wieder an, kann ich eine aktualisierte Datei einlesen.
Dieser Effekt tritt übrigens nicht nur bei meinem Beispielprogramm auf, sondern auch beim Windows Explodierer trotz drücken von F5.
Scheinbar bekommt Windows eine Aktualisierung nicht mit außer die Datei wird von Windows aus verändert.
Frage: Gibt es ggf. eine (API-) Befehl, der Windows zur Aktualisierung zwingt?

Dank vorab und Gruß, Carsten

Nachtrag: Das Gerät meldet sich als HID an und bekommt von Windows einen Laufwerksbuchstaben verpasst.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 13:56
wenn du am Dateisystemtreiber vorbei die Daten änderst, dann kann ja nichts gutes bei rauskommen.
der Windowstreiber kopiert beim Lesen die Daten in seine Cache und ließt dann dort aus ... drum die unveränderten Daten.

Vorschlag: das Laufwerk dismounten und neu mounten (beim Dismounten sollte die Cache freigegeben werden)

Delphi-Quellcode:
hDrive: THandle;
W: LongWord;

hDrive := CreateFile('\\.\X:', GENERIC_READ or GENERIC_WRITE,
  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDrive <> INVALID_HANDLE_VALUE then begin
  DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME { $00090020 },
    nil, 0, nil, 0, W, nil);
  CloseHandle(hDrive);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#3

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 14:14
Zitat von himitsu:
wenn du am Dateisystemtreiber vorbei die Daten änderst, dann kann ja nichts gutes bei rauskommen.
Ich weiß. Und wie es scheint, geht der Weg um einen speziellen (Kauf-) Treiber nicht herum.

Zitat von himitsu:
Delphi-Quellcode:
hDrive: THandle;
W: LongWord;

hDrive := CreateFile('\\.\X:', GENERIC_READ or GENERIC_WRITE,
  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDrive <> INVALID_HANDLE_VALUE then begin
  DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME { $00090020 },
    nil, 0, nil, 0, W, nil);
  CloseHandle(hDrive);
end;
Im Anschluss daran scheitern aber jegliche Lesezugriffe auf diese LOG-Datei, weil zwar das Gerät selbst (im Explorer) noch vorhanden ist, aber ich nicht mehr drauf zugreifen kann..

Gruß, Carsten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 14:25
nja, hab das jetzt nur mal schnell aus Luckie's NTDiskImage rausgemopst.

Bei Disketten scheint es so keine Probleme zu geben.
muß dann wohl noch irgendwie ein FSCTL_MOUNT_VOLUME mit hinten dran.

oder reicht dieses schon aus?
Delphi-Quellcode:
hDrive: THandle;
W: LongWord;

hDrive := CreateFile('\\.\X:', GENERIC_READ or GENERIC_WRITE,
  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDrive <> INVALID_HANDLE_VALUE then begin
  DeviceIoControl(hDisk, FSCTL_LOCK_VOLUME { $00090018 },
    nil, 0, nil, 0, W, nil);
  DeviceIoControl(hDisk, FSCTL_UNLOCK_VOLUME { $0009001C },
    nil, 0, nil, 0, W, nil);
  CloseHandle(hDrive);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#5

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 14:36
Zitat von himitsu:
oder reicht dieses schon aus?
Leider nicht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 15:13
dann bleibt wohl nur dieses
Delphi-Quellcode:
hDrive: THandle;
W: LongWord;

hDrive := CreateFile('\\.\X:', GENERIC_READ or GENERIC_WRITE,
  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDrive <> INVALID_HANDLE_VALUE then begin
  DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME { $00090020 },
    nil, 0, nil, 0, W, nil);
  DeviceIoControl(hDrive, FSCTL_MOUNT_VOLUME,
    nil, 0, nil, 0, W, nil);
  CloseHandle(hDrive);
end;
allerdings hab ich die Definition von FSCTL_MOUNT_VOLUME nicht zur Hand (hier ist kein PSDK installiert und wer weiß, ob's da drinsteht, denn im MSDN wurde garnichts mit FSCTL_MOUNT_VOLUME gefunden)

hier noch 2 Thread, mit selben/ähnlichem Problem ... vielleicht hilft's:
http://groups.google.com/group/micro...11a510107ef5ea
http://www.ureader.com/msg/1473513.aspx


so, ich muß dann aber mal langsam los, hab noch 'nen Termin
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#7

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 15:20
Zitat von himitsu:
allerdings hab ich die Definition von FSCTL_MOUNT_VOLUME nicht zur Hand (hier ist kein PSDK installiert und wer weiß, ob's da drinsteht, denn im MSDN wurde garnichts mit FSCTL_MOUNT_VOLUME gefunden)
Es steht leider nicht drin (hatte ich schon gesucht). S. Klick mich

Zitat von himitsu:
hier noch 2 Thread, mit selben/ähnlichem Problem ... vielleicht hilft's:
Den Fred hatte ich auch schon gelesen, aber trotzdem Danke dafür.

Gruß, Carsten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 15:30
*noch schnell antworte*
man könnte jetzt auch mal versuchen zu raten
Delphi-Quellcode:
FSCTL_LOCK_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16)
                      or (FILE_ANY_ACCESS shl 14)
                      or (6 shl 2)
                      or METHOD_BUFFERED);

FSCTL_UNLOCK_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16)
                      or (FILE_ANY_ACCESS shl 14)
                      or (7 shl 2)
                      or METHOD_BUFFERED);

FSCTL_DISMOUNT_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16)
                      or (FILE_ANY_ACCESS shl 14)
                      or (8 shl 2)
                      or METHOD_BUFFERED);
weitergezählt wäre es dann 'ne 9
Delphi-Quellcode:
FSCTL_MOUNT_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16)
                      or (FILE_ANY_ACCESS shl 14)
                      or (9 shl 2)
                      or METHOD_BUFFERED);

FSCTL_MOUNT_VOLUME = (($00000009 shl 16)
                      or (0 shl 14)
                      or (9 shl 2)
                      or 0);

FSCTL_MOUNT_VOLUME = $00090024;
eventuell kommt der Code aber auch vor FSCTL_LOCK_VOLUME (erst mounten, damit man was machen kann), oder so?
nja dafür könnte man im PSDK mal nachsehn welche Konstanten auch noch in diesem Bereich liegen und versuchen daraus zu raten wo es liegen könnte

zu vermuten wäre ja, das es, zumindestens bis auf (9 shl 2) stimmt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 16:02
Mal son eine ganz dumme zwischenfrage gibts es nicht eine Möglichkeit Windows zu sagen die Datei hat sich geändert, oder lese die Datei neu ein.

Das mit dem Dismounten und neu Mounten kann ja nicht der sinn sein.

P.S. unter Linux heist der Befehl Touch um eine Datei eine Änderung zu erzwingen ohne Sie zu ändern
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Aktualisierung erzwingen

  Alt 15. Jan 2009, 16:24
Touch:
ich glaub Linux lißt nur die Verzeichnisstruckturen nicht neu ein, wenn sie schon im Cache sind ... egal ob sich da was geändert hat, oder nicht.

Mit dem dateiinhalt hat das dann aber nichts zu tun.

Aber du bringts mich da auf 'ne Idee (wenn's klappt) ... also so die Datei öffnen und mit MSDN-Library durchsuchenReadFile lesen.
Delphi-Quellcode:
hFile := CreateFile(PChar(FileName), GENERIC_READ,
  FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
MSDN-Library durchsuchenFILE_FLAG_NO_BUFFERING
dieses sollte die WindowsCache umgehen (leider arbeiten nicht alle USB-Device-Treiber korrekt ... zumindestens kommt es mir so vor, daß dort was mit der Cache vollkommen schief läuft)

falls du was schreiben/speichern willst, dann FILE_FLAG_WRITE_THROUGH, welches an der WindowsCache vorbei direkt auf den Datenträger schreiben sollte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 09:36 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