Entwickler-Ecke
Dateizugriff - Verlauf und Auto-Complete löschen
nina - Mi 05.02.03 09:23
Titel: Verlauf und Auto-Complete löschen
Hallo Leute!
Hier bin ich wieder und das gleich mit zwei Fragen!!!! :D
Kann mir einer von Euch sagen wie ich den Verlauf löschen kann. Ich habe schon einiges probiert, aber das alles klappt nicht so wie ich es gerne hätte! Der Verlauf steht bei mir unter
C:\Dokumente und Einstellungen\Administrator\Lokale Einstellungen\Verlauf
Und dann würde ich auch noch gerne wissen, wie man die Auto-Complete Einträge löschen kann!!!
Danke schon mal im vorraus für Eure hilfe!!!
nina
Shadowdragon - Mi 05.02.03 17:06
Also da gibt's 2 Wege, von denen ich weiss.
(1) Du schreibst das Ganze in QBASIC, und zwar so:
Quelltext
1: 2: 3:
| CLS KILL "C:\Dokumente und Einstellungen\Administrator\Lokale Einstellungen\Verlauf\*.*" END |
In Delphi gibt's den Befehl DeleteFile, der schaut dann so aus:
Quelltext
1: 2: 3:
| begin deletefile ('C:\buch\blabla.txt') ; end; |
Wie man damit aber den Inahlt eines gesamten Ordners löscht, weiss ich nicht, sorry...
wahrscheinlich kann einer der Profis hier weiterhelfen.
hansa - Fr 07.02.03 20:26
| Shadowdragon hat folgendes geschrieben: |
QBASIC ähm, was ist das ? Oder wer braucht das ?
Quelltext 1: 2: 3:
| begin deletefile ('C:\buch\blabla.txt') ; end; |
|
Ersetze blabla.txt durch *.*, der Pfad muß aber stimmen.
Gruß
Hansa
Shadowdragon - Fr 07.02.03 20:44
QBASIC steht für QuickBASIC und ist ein DOS-Programmierprogramm, eines der einsteigerfreundlichsten :)
Ja, hansa, dachte ich auch, dem ist aber nicht so! Delphi muss irgend einen anderen Zeichencode für "alle Dateien" haben, denn ich habe es etliche male mit dem *.* ausprobiert, und das geht nicht! Bei QBASIC klappt das prima, aber bei Delphi nicht.
Und an meiner Version kann das ja schlecht liegen, schließlich hab ich Delphi 6 Personal ....... :?
hansa - Fr 07.02.03 21:35
| Shadowdragon hat folgendes geschrieben: |
| ... Ja, hansa, dachte ich auch, dem ist aber nicht so! ..... |
Da scheinst Du Recht zu haben. Hier ist ein Grundgerüst für sowas, das funktioniert :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); begin deleteFile ('net.001'); deleteFile ('net.cfg'); IF NOT RemoveDir ('C:\a') THEN showmessage ('Verzeichnis XY konnte nicht gelöscht werden !'); end; |
Auf Anhieb verstehe ich das auch nicht (mehr). 8) Notfalls muß mit
FINDFIRST,
FINDNEXT eine Repeat - Schleife aufgebaut werden. Falls es dringend ist habe ich dazu ein Beispiel.
Gruß
Hansa
Korrektur: Im Verzeichnis C:\a sind nur diese zwei Dateien :!: Vor RemoveDir muß das leer sein!
Brueggendiek - Fr 07.02.03 21:52
Hallo!
Da stimmt aber was nicht!
| hansa hat folgendes geschrieben: |
Quelltext 1: 2: 3:
| begin deletefile ('C:\buch\blabla.txt') ; end; |
Ersetze blabla.txt durch *.*, der Pfad muß aber stimmen. |
DeleteFile kann nur eine Datei löschen!
Es wird wohl nichts anderes übrig bleiben, als mit FindFirst/FindNext/FindClose zu arbeiten und die Dateien einzeln zu löschen!
Gruß
Dietmar Brüggendiek
hansa - Fr 07.02.03 22:00
Hi Brueggendiek,
auch schon aufgewacht? 8) Ich hab ja zumindest vor ner halben Stunde noch geschrieben wie das ganze restlos zu beseitigen ist. :mrgreen: :mrgreen:
Gruß
Hansa
Shadowdragon - Fr 07.02.03 22:38
Ich hab das Ganze mal in QBASIC für dich geschrieben, funktioniert einwandfrei.....
wenn du's haben willst, mail mir mal, man darf hier ja keine Links posten.
Kriegst auch den Source dazu ^__^
Delete - Sa 08.02.03 09:37
| Brueggendiek hat folgendes geschrieben: |
| Es wird wohl nichts anderes übrig bleiben, als mit FindFirst/FindNext/FindClose zu arbeiten und die Dateien einzeln zu löschen! |
Wie wär´s mit
SHFILEOPERATION? Neben Kopieren und Verschieben lassen sich damit Dateien auch löschen.
Mehrere Dateien, ganze Ordner ... inkl. Fortschrittsanzeige -wenn´s mal wieder länger dauert!- weil das ganze nämlich der Funktion aus dem Win-Explorer entspricht.
Beispiele müssten hier im Forum zu finden sein.
Auf jeden Fall fündig wird man im MSDN/PSDK.
nina - Mi 12.02.03 08:42
Hallo Leute,
danke für Eure Tipps. Ich werde sie im laufe des Tages mal ausprobieren und wenn es klappt dann meld ich mich und wenn nicht, dann meld ich mich ebenfalls!!!! :D
nina
nina - Do 13.02.03 14:32
Hallo Leute,
also ich habs jetzt gestern den ganzen Tag probiert und heute vormittag auch noch mal. Aber kein einziger Code funzt bei mir!!!! Ich werde den Code mal hier rein schreiben, vielleicht sieht ja einer von Euch den Fehler. Was ich vielleicht noch dazusagen sollte! Delphi compiliert zwar das Programm richtig, aber löschen tut er den Ordner "Verlauf" deswegen troztdem nich!!!
Unter
implementation steht dieser Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function DelDir(dir: string): Boolean; var fos: TSHFileOpStruct; begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_DELETE; fFlags := FOF_SILENT or FOF_NOCONFIRMATION; pFrom := PChar(dir + #0); end; Result := (0 = ShFileOperation(fos)); end; |
Und unter dem Button "Löschen" steht dieser:
Delphi-Quelltext
1: 2: 3: 4:
| if history.Checked then begin DelDir('C:\Dokumente und Einstellungen\+"GetCurrentUserName"+\Lokale Einstellungen\Verlauf\'); end; |
Wäre Euch sehr dankbar wenn mir einer da draussen helfen könnte!!!!
nina
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
Brueggendiek - Fr 14.02.03 06:20
Hallo Nina!
So wie ich das verstanden habe, muß SHFileOperation einen (oder mehrere) Dateinamen haben. "blabla\" ist aber ein Directorynamen!
Schreibe doch einfach man "blabla\*.*" - Versuch macht kluch!
Gruß
Dietmar Brüggendiek
nina - Fr 14.02.03 09:06
Hallo Dietmar,
danke für den Tipp. Im ersten Moment hat es auch geklappt, aber sobald ich wieder im Netz bin, sind alle Adressen wieder im Verlauf drin. Damit meine ich dann auch die Adressen vom Tag vorher, die ich ja kurz vorher gelöscht hatte.
Ich schätze mal, dass das an den index. dat liegt, denn die sind ja in diesem Moment nicht gelöscht. Ich bin auch gerade dabei herauszufinden wie das in Delphi funktioniert. Habe allerdings erst herausgefunden, dass man die index. dat wahrscheinlich in Windows nur im DOS löschen kann.
Wenn irgendjemand mehr dazu weiss, dann postet es mir bitte!!!!
Danke
nina
Delete - Fr 14.02.03 11:27
| Brueggendiek hat folgendes geschrieben: |
| So wie ich das verstanden habe, muß SHFileOperation einen (oder mehrere) Dateinamen haben. "blabla\" ist aber ein Directorynamen! |
Nein. Es können auch Ordnernamen sein. Dass die Funktion einen Fehler verursacht, liegt IMHO am Backslash am Ende. Bei jedem anderen Ordner geht´s simpel mit
Delphi-Quelltext
1:
| DelDir('C:\OrdnerName'); |
bspw.
Zum Löschen des Verlaufs braucht man aber was anderes. ´s wundert mich, dass sich DaFox noch nicht zu Wort gemeldet hat. (@Markus: :wink:). Folgender Tipp stammt von ihm und funktioniert sehr gut.
Die Warnung zuerst:
Wer ohne die VCL arbeitet, sollte unbedingt die Unit "ActiveX" zusätzlich einbinden und im Hauptteil des Programms folgendes tun:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| begin CoInitialize(nil);
CoUnInitialize; end. |
Ohne dies gab´s bei mir einen saftigen Blue-Screen bzw. Fehlermeldungen beim Versuch, den Cache zu löschen. Bei der VCL ist zu 95% davon auszugehen, dass -insbesondere bei der Nutzung von solchen COM- u.ä. Routinen- die beiden o.g. Befehle durch eine andere Unit aufgerufen werden. Wer 100% sicher sein will, integriert diese beiden Befehle auch bei VCL-Projekten in seine Unit. Anbieten würde sich dazu der
initialization/
finalization-Teil.
Nun aber:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| uses ComObj;
type STATURL = record cbSize: DWORD; pwcsUrl: DWORD; pwcsTitle: DWORD; ftLastVisited: FILETIME; ftLastUpdated: FILETIME; ftExpires: FILETIME; dwFlags: DWORD; end;
IEnumSTATURL = interface(IUnknown) ['{3C374A42-BAE4-11CF-BF7D-00AA006946EE}'] function Next(celt: Integer; out elt; pceltFetched: PLongint): HRESULT; stdcall; function Skip(celt: Longint): HRESULT; stdcall; function Reset: HResult; stdcall; function Clone(out ppenum: IEnumSTATURL): HResult; stdcall; function SetFilter(poszFilter: PWideChar; dwFlags: DWORD): HResult; stdcall; end;
IUrlHistoryStg = interface(IUnknown) ['{3C374A41-BAE4-11CF-BF7D-00AA006946EE}'] function AddUrl(pocsUrl: PWideChar; pocsTitle: PWideChar; dwFlags: Integer): HResult; stdcall; function DeleteUrl(pocsUrl: PWideChar; dwFlags: Integer): HResult; stdcall; function QueryUrl(pocsUrl: PWideChar; dwFlags: Integer; var lpSTATURL: STATURL): HResult; stdcall; function BindToObject(pocsUrl: PWideChar; var riid: TIID; out ppvOut: Pointer): HResult; stdcall; function EnumUrls(out ppenum: IEnumSTATURL): HResult; stdcall; end;
IUrlHistoryStg2 = interface(IUrlHistoryStg) ['{AFA0DC11-C313-11D0-831A-00C04FD5AE38}'] function AddUrlAndNotify(pocsUrl: PWideChar; pocsTitle: PWideChar; dwFlags: Integer; fWriteHistory: Integer; var poctNotify: Pointer; const punkISFolder: IUnknown): HResult; stdcall; function ClearHistory: HResult; stdcall; end;
IUrlHistoryNotify = interface(IOleCommandTarget) ['{BC40BEC1-C493-11d0-831B-00C04FD5AE38}'] end;
procedure ClearIEHistory; const CLSID_CUrlHistory : TGUID = '{3C374A40-BAE4-11CF-BF7D-00AA006946EE}'; var ie : IUrlHistoryStg2; begin ie := CreateComObject(CLSID_CUrlHistory) as IUrlHistoryStg2; ie.ClearHistory; end; |
Einfach nur die Prozedur "ClearIEHistory" aufrufen, und das war´s.
Eure Dankesworte bitte an DaFox richten. :)
DaFox - Fr 14.02.03 20:43
| MathiasSimmack hat folgendes geschrieben: |
´s wundert mich, dass sich DaFox noch nicht zu Wort gemeldet hat. (@Markus: :wink:).
|
Mache ich hiermit und bitte gleich um Verzeihung, dass ich momentan sehr selten hier anzutreffen bin. Stecke mitten im Prüfungsstress... :autsch:
| MathiasSimmack hat folgendes geschrieben: |
Folgender Tipp stammt von ihm und funktioniert sehr gut.
|
Ehrlich? Ich kenne diesen Code zwar, weiß aber momentan nicht mehr wo bzw. dass ich diesen gepostet habe (Prüfungsstress, s.o.)
Na sowas, dass ich doch auch immer die Sourcecodes so freizügig unter die Leute bringe... :wink:
| MathiasSimmack hat folgendes geschrieben: |
Eure Dankesworte bitte an DaFox richten. :)
|
Nicht nötig, einfach alle Daumen halten für die Ana-Prüfung...
Gruß,
Markus
Nachtrag: @Mathias: EE? :wink:
nina - Sa 15.02.03 12:58
Huhu!!!
Erst einmal danke an Euch alle die mir versucht haben zu helfe. Denn es hat jetzt endlich geklappt. Juhu :dance:
Ich habe gestern noch den Code vom Mathias (DaFox) ausprobiert und es hat geklappt. Endlich!!! Vielen Dank Euch beiden!!!
Erst dachte ich es würde schon wieder nicht funktionieren, weil er mir den heutigen Verlauf nicht gelöscht hat. Aber beim Versuch den Verlauf auf einem anderen Rechner zu löschen, war es genau das gleich, und somit bin ich mal der Meinung das er den heute Verlauf nicht gleich löscht.
Vielen Dank noch mal und bis bald, denn ich kann Euch versprechen, dass ich recht bald wieder posten werde. Wahscheinlich schon ab Montag! Also, macht Euch auf was gefasst!! Ich danke schon mal im vorraus!!!!
nina
P.S. DaFox, ich drücke Dir die Daumen für die Prüfung und wünsche Dir natürlich auch viel Glück dabei!!!
Andi1982 - So 02.11.03 19:35
Hallo,
habe gerade den Code von DaFox in mein Programm eingebaut, obwohl ich den absolut nicht vestehe, aber es löscht meinen Verlauf tatsächlich :o
Aber angenommen ich will aus meinem Verlauf nur eine URL löschen oder in meinem Fall den "Arbeitsplatz". Das geht doch bestimmt auch irgendwie mit dem Code, nur weiß ich nicht wo ich das anpacken muss :roll:
hat einer ne idee oder noch besser, weiß es jemand??
Gruß Andi
Delete - Mo 03.11.03 09:57
Das Prinzip des o.g. Codes ist recht einfach: das Betriebssystem (allerdings erst ME, 2000 und höher) stellen ein Interface namens
IUrlHistoryStg2 zur Verfügung. Dieses Interface besitzt die Funktion/Methode/nenn-es-wie-du-willst "ClearHistory", um die komplette IE-History zu löschen.
(So gibt es bspw. auch Interfaces zum Anlegen und Auslesen von Verknüpfungen = IShellLink)
Eine zweite Möglichkeit, gezielt URLs zu löschen, wäre das Interface
IUrlHistoryStg [
http://msdn.microsoft.com/workshop/networking/urlhist/iurlhistorystg/iurlhistory.asp] (quasi ohne die 2 am Ende). Das ist ja auch in obigem Code enthalten. Die bietet die Methoden "EnumUrls" und "DeleteUrl" (auf die wirst du´s wohl abgesehen habe). Das Problem ist aber ebenfalls das Betriebssystem: Minimum sind der IE 5.5 und min. Win ME oder 2000.
Eine andere Möglichkeit, den Cache auszulesen und damit auch auf die Einträge im Verlauf zuzugreifen, wäre
FINDFIRSTURLCACHEENTRY. Das Prinzip ähnelt
FindFirst und funktioniert auch unter 9x und NT4.
Andi1982 - Mo 03.11.03 10:05
Vielen Dank,
hat mir sehr geholfen! Werde jetzt mal versuchen selbst was damit hinzubekommen. Kann aber sein dass ich mich schon bald wieder mit diesem Thema melde...
Delete - Mo 03.11.03 10:53
Ich muss mich übrigens noch korrigieren. Die o.g. Interfaces funktionieren natürlich auch unter Win 9x. Wichtig ist nur, dass ein aktueller IE (min. 5.5) drauf ist.
@DaFox: Falls du mal wieder anwesend bist, wie sieht´s mit deiner geschätzten Meinung dazu aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type STATURL = record cbSize: DWORD; pwcsUrl: DWORD; pwcsTitle: DWORD; ftLastVisited: FILETIME; ftLastUpdated: FILETIME; ftExpires: FILETIME; dwFlags: DWORD; end; |
Laut PSDK müssten die beiden markierten Einträge eigentlich LPWSTR (also WideChars) sein.
DaFox - Mo 03.11.03 22:05
Hi Mathias & alle anderen,
| MathiasSimmack hat folgendes geschrieben: |
Ich muss mich übrigens noch korrigieren. Die o.g. Interfaces funktionieren natürlich auch unter Win 9x. Wichtig ist nur, dass ein aktueller IE (min. 5.5) drauf ist.
|
Ja, das PSDK sagt (fälschlicherweise?)
| Zitat: |
Minimum operating systems: Millennium, Windows 2000
|
Ohne es getestet zu haben, denke ich aber, dass es reichen müsste den IE5.5 installiert zu haben. Dieser benötigt mind. Windows 95/Windows NT (btw: IE6 benötigt mind. Win98; bald werden wir mit solchen Techniken also nicht mehr alle Windowsversionen ab 95 abdecken können).
| MathiasSimmack hat folgendes geschrieben: |
@DaFox: Falls du mal wieder anwesend bist, [...]
|
Ganz schön frech... Ich bin immer anwesend!! :wink:
| MathiasSimmack hat folgendes geschrieben: |
[...] wie sieht´s mit deiner geschätzten Meinung dazu aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type STATURL = record cbSize: DWORD; pwcsUrl: DWORD; pwcsTitle: DWORD; ftLastVisited: FILETIME; ftLastUpdated: FILETIME; ftExpires: FILETIME; dwFlags: DWORD; end; |
Laut PSDK müssten die beiden markierten Einträge eigentlich LPWSTR (also WideChars) sein. |
Mathias, Du hast natürlich wie immer Recht!
Mein Source sah damals in etwa so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TForm1.Button2Click(Sender: TObject); const CLSID_CUrlHistory: TGUID = '{3C374A40-BAE4-11CF-BF7D-00AA006946EE}'; var r: TStatURL; Enum: IEnumStatUrl; X: Integer; Row: Integer; I: IUrlHistoryStg2; begin StringGrid1.Cells[0, 0] := 'Last Visited'; StringGrid1.Cells[1, 0] := 'Title'; StringGrid1.Cells[2, 0] := 'Url'; StringGrid1.Cells[3, 0] := 'Last Updated'; StringGrid1.Cells[4, 0] := 'Expires'; Row := 0; I := CreateComObject(ClsId_CUrlHistory) as IUrlHistoryStg2; I.EnumUrls(Enum); Enum.SetFilter('http://', 0); while enum.next(1, r, @X) = S_OK do begin Inc(Row); StringGrid1.RowCount := Row + 1; Stringgrid1.Cells[0, Row] := DateTimeToStr(FileTimeToDateTime(r.ftLastVisited)); Stringgrid1.Cells[1, Row] := PWideChar(Pointer(r.pwcsTitle)); Stringgrid1.Cells[2, Row] := PWideChar(Pointer(r.pwcsUrl)); Stringgrid1.Cells[3, Row] := DateTimeToStr(FileTimeToDateTime(r.ftLastUpdated)); Stringgrid1.Cells[4, Row] := DateTimeToStr(FileTimeToDateTime(r.ftExpires)); end; end; |
Ändert man nun den Record in
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| TSTATURL = record cbSize: DWORD; pwcsUrl: <span style="font-weight: bold">PWideChar</span>; pwcsTitle: <span style="font-weight: bold">PWideChar</span>; ftLastVisited: FILETIME; ftLastUpdated: FILETIME; ftExpires: FILETIME; dwFlags: DWORD; end; |
so spart man sich das Casten und er stimmt mit den Vorgaben im PSDK überein! (Aaah, ich liebe Pointer :wink: )
Viele Grüße,
Markus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!