Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Laufwerke für schnelle Dateisuche indizieren (https://www.delphipraxis.net/53570-laufwerke-fuer-schnelle-dateisuche-indizieren.html)

mumu 19. Sep 2005 10:26


Laufwerke für schnelle Dateisuche indizieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
wie kann ich diese Funktion mittels API Befehl aktivieren bzw. deaktivieren? (siehe anhang)

NicoDE 19. Sep 2005 12:38

Re: Laufwerke für schnelle Dateisuche indizieren
 
Vielleicht mit:
Delphi-Quellcode:
// indizieren
SetFileAttributes(..., GetFileAttributes(...) and not FILE_ATTRIBUTE_NOT_CONTENT_INDEXED);
// nicht indizieren
SetFileAttributes(..., GetFileAttributes(...) or FILE_ATTRIBUTE_NOT_CONTENT_INDEXED);

himitsu 19. Sep 2005 12:52

Re: Laufwerke für schnelle Dateisuche indizieren
 
Also der Code von Nico funktioniert (allerdings nur für das Indexattribut und nicht für die Verschlüsselung - und natürlich auch nur auf NTFS-Laufwerken)

Allerdings ist das ja nur der Weg für Dateien/Verzeichnisse ... bei der Standardeinstellung des Laufwerkes geht damit nichts. (und mumu scheint ja gerade dieses zu wollen)

mumu 19. Sep 2005 13:02

Re: Laufwerke für schnelle Dateisuche indizieren
 
ja genau, ich möchte die komplette indizierung des laufwerkes deaktivieren und nicht nur die von einzelnen dateien und verzeichnissen.

oder muss ich dazu einfach alle dateien und verzeichnisse durchgehen und jeweils das indizierungsattribut deaktivieren?

NicoDE 19. Sep 2005 13:08

Re: Laufwerke für schnelle Dateisuche indizieren
 
Zitat:

Zitat von himitsu
bei der Standardeinstellung des Laufwerkes geht damit nichts.

Getestet unter welchem System?
(lies: bei mir geht's)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  INVALID_FILE_ATTRIBUTES = DWORD(-1);
  FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = $00002000;
var
  Attr: DWORD;
begin
  Attr := GetFileAttributes(PChar(Edit1.Text));
  if INVALID_FILE_ATTRIBUTES = Attr then
  begin
    ShowMessage('GetFileAttributes: ' + SysErrorMessage(GetLastError()));
    Exit;
  end;
  if CheckBox1.Checked then
    Attr := Attr and not FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
  else
    Attr := Attr or FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
  if not SetFileAttributes(PChar(Edit1.Text), Attr) then
    ShowMessage('SetFileAttributes: ' + SysErrorMessage(GetLastError()));
end;
Zitat:

Zitat von mumu
oder muss ich dazu einfach alle dateien und verzeichnisse durchgehen und jeweils das indizierungsattribut deaktivieren?

Ja.
(nichts anderes macht der Standard-Eigenschaftsdialog)

himitsu 19. Sep 2005 13:14

Re: Laufwerke für schnelle Dateisuche indizieren
 
Du kannst das natürlich bei allen Dateien einzeln abstellen.
Und in den Unterverzechnissen des Laufwerkt ist dann auch die indizierung abgestellt, da ja meistens die Attribute des Verzeichnisses genommen werden.
Allerdings werden dann alle neu erstellten Dateien/Verzeichnisse im Hauptverzeichnis immer wieder indiziert, diese ja die Attribute des Laufwerks bekommen.

PS: Ich persünlich hab ja der Indizierung direkt in der Systemsteuerung den gar ausgemacht ... hab sie einfach "deinstalliert" ^^


getestet auf'm WinXP Pro.

NicoDE 19. Sep 2005 13:24

Re: Laufwerke für schnelle Dateisuche indizieren
 
Zitat:

Zitat von himitsu
getestet auf'm WinXP Pro.

Was hast Du als Dateinamen angegeben?
(meiner einer hat 'I:' verwendet, also ohne '\')

marabu 19. Sep 2005 14:23

Re: Laufwerke für schnelle Dateisuche indizieren
 
Hi folks,

wenn die Indexerstellung für das Dateisystem abgeschaltet werden soll, dann gibt es da verschiedene Methoden. Hier ein Beispiel, bei dem alle Einstellungen erhalten bleiben, aber das Befüllen des zugehörigen Katalogs angehalten wird:

Delphi-Quellcode:
const
  CICAT_STOPPED = 1;

function SetCatalogState(catalog: PWideChar; machine: PWideChar;
  newState: Cardinal; var OldState: Cardinal): Cardinal;
  stdcall; external 'query.dll';

procedure TMainForm.StopButtonClick(Sender: TObject);
var
  wsCatalog, wsMachine: WideString;
  dwResult, oldState: Cardinal;
begin
  wsCatalog := 'system';
  wsMachine := '.';
  dwResult := SetCatalogState(PWideChar(wsCatalog), PWideChar(wsMachine), CICAT_STOPPED, oldState);
  if dwResult = 0
    then ShowMessage('angehalten')
    else ShowMessage(IntToHex(dwResult, 8));
end;
Wer mehr will, der sollte die Automationsobjekte aus der ciodm.dll importieren und sich ein wenig mit der query.dll (beide %windir%\system32) beschäftigen.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 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