{"id":55001142,"date":"2018-08-01T00:00:00","date_gmt":"2020-05-13T21:11:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1142"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Dateien_schnell_suchen_mit_Everything","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/","title":{"rendered":"Dateien schnell suchen mit Everything"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/24b53cb6e46e459eb9cfb6c34d73aefb\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Verlieren Sie auch hin und wieder den &uuml;berblick &uuml;ber Ihr Dateisystem und finden partout bestimmte Dateien nicht mehr auf Dann ist neben der Windows-Suche ein Tool wie Everything ein guter Freund. Doch nicht nur die Anwendung mit ihrer Oberfl&auml;che selbst ist ein ausgereifter Helfer. Denn als Pluspunkt k&ouml;nnen Sie zus&auml;tzlich eine API-Schnittstelle verbuchen, welche sich aus Access heraus ansprechen l&auml;sst.<\/b><\/p>\n<h2>Everything<\/h2>\n<p>Gerade als Entwickler nennen Sie wahrscheinlich einen Rechner ihr Eigen, welcher mit Programmen, Tools, Dokumenten, Quellcode und anderen Dateien vollgestopft ist. Ich verzeichne aktuell &uuml;ber zwei Millionen Dateien auf meinem Hauptrechner. Da hei&szlig;t es Ordnung halten und das Dateisystem gut strukturieren. Dennoch kommt es h&auml;ufig vor, dass der Verbleib mancher Dateien schleierhaft bleibt &#8211; vor allem dann, wenn sie mehrfach in verschiedenen Verzeichnissen abgelegt wurden. Nun k&ouml;nnen Sie zum Auffinden selbstverst&auml;ndlich die Suche benutzen, die Windows von Haus aus mitbringt und, etwa unter <b>Windows 10<\/b>, die Suche namens <b>Cortona<\/b> befragen. <b>Windows Search<\/b> indiziert im Hintergrund fortw&auml;hrend das System und f&uuml;llt damit eine Datenbank, die im Ergebnis eine relativ schnelle Suche erm&ouml;glicht. Allerdings kann ich mich weder mit den m&ouml;glichen Suchparametern, noch mit der Pr&auml;sentation der Ergebnisse so richtig anfreunden. Deshalb gibt es eine Menge Tools, die die L&uuml;cke schlie&szlig;en und eine Alternative anbieten.<\/p>\n<p><b>Everything<\/b> von <b>voidtools.com<\/b> sticht dabei unter mehreren Aspekten heraus. Zwar gibt es mittlerweile diverse Freeware-Tools, die ebenso schnell arbeiten, weil sie als Basis die <b>MFTs<\/b> der Festplatten heranziehen, doch gerade die ausgefeilte <b>API<\/b>-Schnittstelle von <b>Everything<\/b> stellt ein Alleinstellungsmerkmal dar. Zudem haben Sie bei Installation die Wahl zwischen einer Systeminstallation und der <b>Portable Version<\/b>, bei der Sie den Download nur in ein Verzeichnis Ihrer Wahl entpacken.<\/p>\n<p>Sollten Sie <b>Everything<\/b> noch nicht kennen, so lohnt sich zun&auml;chst ein Blick in die <b>FAQ<\/b> auf den Seiten von <b>void-tools<\/b>. Unter dem Men&uuml;punkt <b>Support<\/b> finden Sie dort dann eine ausf&uuml;hrliche Beschreibung aller M&ouml;glichkeiten und alles zum Umgang mit der Anwendung. M&ouml;chten Sie das Programm nutzen, so begeben Sie sich zu den <b>Downloads<\/b> und w&auml;hlen unter verschiedenen Optionen die passende Version.<\/p>\n<p>Es spielt, soviel vorweggenommen, keine Rolle, ob Sie die <b>32-Bit<\/b>&#8211; oder die <b>64-Bit<\/b>-Version nehmen. Normalerweise m&uuml;ssen Sie bei <b>Office<\/b>, das Sie sicherlich als 32-Bit-Version vorliegen haben, darauf achten, dass ein Programm, welches &uuml;ber eine <b>API<\/b>-Schnittstelle angesprochen wird, ebenfalls in 32 Bit vorliegt. Doch mit <b>Everything<\/b> wird gar nicht direkt kommuniziert, sondern &uuml;ber eine intermedi&auml;re DLL, die einen standardisierten Transportmechanismus von Windows nutzt, n&auml;mlich <b>IPC<\/b>. Der kann sich zwischen 32-Bit- und 64-Bit-Programmen gleicherma&szlig;en austauschen. Vielleicht liegt Ihnen die portable Version eher, als die Installation &uuml;ber eine <b>Setup<\/b>&#8211; oder <b>MSI<\/b>-Datei. Allerdings installiert letztere zun&auml;chst nicht einen Windows-Service, der das System automatisch im Hintergrund indiziert. Sie m&uuml;ssen dann die Anwendung erst unter Administratorrechten starten, was den bekannten <b>UAC-Prompt <\/b>unumg&auml;nglich macht. Erst dann scannt das Tool das System.<\/p>\n<h2>Wie funktioniert Everything<\/h2>\n<p>Wollten Sie das Dateisystem mit Bordmitteln von Windows auslesen und sich dabei solcher <b>API<\/b>-Funktionen, wie <b>FindFileFirst<\/b>, et cetera, bedienen, oder unter VBA die <b>Dir<\/b>-Funktion nutzen, oder einen Verweis auf ein <b>File System Object<\/b> setzen, um mit jenem zu arbeiten, so k&ouml;nnen Sie auch auf einem schnellen Rechner bei Millionen von Dateien eine lange Kaffeepause einlegen. Solche Verfahren sind zum Scannen des gesamten Dateisystems schlicht ungeeignet.<\/p>\n<p><b>Everything<\/b> nimmt sich jedoch direkt die <b>MFT<\/b> (<b>Master File Table<\/b>) einer Festplattenpartition zur Brust, die ein Verzeichnis aller Dateien und Ordner darstellt. Die Indizierung l&auml;uft deshalb unglaublich schnell ab. Bei den erw&auml;hnten zwei Millionen Dateien ist das hier in etwa 30 Sekunden erledigt. Ist die interne <b>Everything<\/b>-Datenbank einmal angelegt, so ber&uuml;cksichtigt das Tool nur noch &auml;nderungen am Dateisystem.<\/p>\n<p>Nach dem Start dauert dies dann gerade einmal zwei bis f&uuml;nf Sekunden, je nachdem, wieviel sich seit dem letzten Indizieren am Dateisystem ge&auml;ndert hat. Voraussetzung allerdings ist, dass das Dateisystem mit <b>NTFS<\/b> partitioniert ist. <b>FAT<\/b> kann <b>Everything<\/b> nat&uuml;rlich ebenfalls lesen, doch dann kommen die altbekannten Windows-API-Verfahren zum Zug, die erheblich langsamer sind.<\/p>\n<p>Sinnvoll ist es deshalb, eine Verkn&uuml;pfung zum Tool in den <b>Autostart<\/b>-Ordner von Windows zu legen, wenn Sie die portable Version verwenden. Nach dem Start der Anwendung minimiert sich diese in den <b>Tray<\/b> von Windows. Mit Doppelklick auf das entsprechende Lupen-Icon &ouml;ffnet sich dann die Oberfl&auml;che des Tools. Ist <b>Everything<\/b> als Service installiert, so ist das <b>Tray-Icon<\/b> automatisch immer aktiv. Solange die Anwendung l&auml;uft, bekommt sie alle &auml;nderungen am Dateisystem mit und modifiziert demgem&auml;&szlig; ihre Datenbank. Das l&auml;sst sich sogar Live beobachten, wenn Sie die Oberfl&auml;che von <b>Everything<\/b> ge&ouml;ffnet haben.<\/p>\n<p>Das <b>GUI<\/b> von <b>Everything<\/b> zeigt Bild 1. Im Textfeld oben geben Sie einen Suchbegriff ein, und sofort filtert sich die Ergebnisliste unten entsprechend. Die Syntax f&uuml;r den Suchbegriff ist dabei weitaus m&auml;chtiger, als die von Windows. Hier k&ouml;nnen spezielle Platzhalter zum Einsatz kommen und allerlei Kombinationen derselben bis hin zu regul&auml;ren Ausdr&uuml;cken. Das Kombinationsfeld rechts neben dem Suchfeld erlaubt die einfache Filterung nach Kategorien, wie etwa Dokumente, Bilder oder Videos. Die Eintr&auml;ge in dieser Combobox k&ouml;nnen Sie zuvor selbst festgelegt haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_04\/EverythingEXE.png\" alt=\"Das GUI von Everything wirkt auf den ersten Blick recht unspektakul&auml;r und eher spartanisch, hat unter der Haube aber viel zu bieten.\" width=\"700\" height=\"313,3891\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Das GUI von Everything wirkt auf den ersten Blick recht unspektakul&auml;r und eher spartanisch, hat unter der Haube aber viel zu bieten.<\/span><\/b><\/p>\n<p>Die Ergebnisliste ist nicht einfach nur eine Liste, sondern hat alle Eigenschaften der Windows-<b>Shell<\/b>. Das bedeutet, dass die gelisteten Dateien etwa dasselbe Kontextmen&uuml; anzeigen, wie der Explorer, und Kopier- sowie <b>Drag And Drop<\/b>-Operationen zulassen. Doch Gegenstand dieses Beitrags ist nicht die Beschreibung des Tools selbst, sondern seine Fernsteuerung. Zum Umgang mit der Anwendung finden Sie alle Informationen unter dem Men&uuml;punkt <b>Support<\/b> auf <b>voidtools<\/b>. Sie werden staunen, was alles mit <b>Everything<\/b> m&ouml;glich ist!<\/p>\n<h2>API-Schnittstelle<\/h2>\n<p>Unter dem Stichwort <b>SDK<\/b> k&ouml;nnen Sie auf <b>voidtools<\/b> die interaktive Schnittstelle zu <b>Everything<\/b> herunterladen. Die Funktionen der Schnittstelle sind zudem auf den Webseiten genau dokumentiert. &uuml;ber diese Schnittstelle k&ouml;nnen Sie dann dieselben Vorg&auml;nge realisieren, wie auch manuell &uuml;ber die <b>GUI:<\/b> Sie setzen einen Suchbegriff ab, &uuml;bergeben einige Suchoptionen, und erhalten als Resultat eine Liste mit den gefundenen Dateien oder Ordner. Das <b>GUI<\/b> von <b>Everything<\/b> muss w&auml;hrend dieses Vorgangs nicht ge&ouml;ffnet sein.<\/p>\n<p>Nun hatte <b>David Carpenter<\/b>, der Entwickler von <b>voidtools<\/b>, mit diesem <b>SDK<\/b> nicht unbedingt <b>Visual Basic<\/b>-Entwickler als Zielgruppe im Sinn. Die Dokumentation st&uuml;tzt sich deshalb auf <b>C<\/b>. Zwar finden Sie im Netz &#8211; genauer: im Forum zu <b>Everything<\/b> &#8211; auch eine VB-Portierung der <b>C-Header<\/b>-Dateien, doch die ist etwas veraltet und hat nur eine Teilmenge der Methoden &uuml;bersetzt.<\/p>\n<p>Also hat <b>Access im Unternehmen<\/b> die Flei&szlig;arbeit f&uuml;r Sie &uuml;bernommen und praktisch alle <b>API<\/b>-Aufrufe nach <b>VBA<\/b> &uuml;bersetzt, sodass Sie nun auch aus einer Datenbank heraus Zugriff auf <b>Everything<\/b> haben &#8211; mit den gleichen M&ouml;glichkeiten, wie ein <b>C++<\/b>-Programmierer.<\/p>\n<p>Alles, was Sie dazu ben&ouml;tigen, ist eine aktuelle Version der <b>everything32.dll<\/b>, die als Bestandteil des <b>SDK<\/b> den <b>IPC<\/b>-Mittler zwischen <b>API<\/b> und <b>Everything<\/b>-Anwendung oder -Dienst darstellt. Sie finden die DLL direkt im Download zur Demodatenbank. Und schlie&szlig;lich brauchen Sie noch alle API-Deklarationen zur DLL, die sich im Klassenmodul <b>clsEverything<\/b> der Demo befinden. Die kleine Testprozedur in Listing 1 zeigt zun&auml;chst, wie Sie dieses Modul einsetzen. Hier soll <b>Everything<\/b> untersuchen, wo sich alle Dateien mit dem Namen <b>mscomctl.ocx<\/b> befinden. Die Prozedur rufen Sie einfach aus dem VBA-Direktfenster heraus auf.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>TestEverything(<span style=\"color:blue;\">Optional<\/span> ByVal Search<span style=\"color:blue;\"> As String<\/span> = \"mscomctl.ocx\")\r\n     <span style=\"color:blue;\">Dim <\/span>C<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> clsEverything\r\n     <span style=\"color:blue;\">Dim <\/span>ret()<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>sCols<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>, j<span style=\"color:blue;\"> As Long<\/span>\r\n     ShellExecute 0&, \"open\", CurrentProject.Path & _\r\n         \"\\starteverything.vbs\", vbNullString, CurrentProject.Path, 0&\r\n     <span style=\"color:blue;\">With<\/span> C\r\n         <span style=\"color:blue;\">If <\/span>.Ready<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> .Version\r\n             .CaseSensitive = <span style=\"color:blue;\">False<\/span>\r\n             .ResultLimit = 2000\r\n             .ResultProperties = EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME Or _\r\n                                 EVERYTHING_REQUEST_DATE_CREATED\r\n             .ShowMessages = <span style=\"color:blue;\">True<\/span>\r\n             .SortOrder = EVERYTHING_SORT_PATH_ASCENDING\r\n             <span style=\"color:blue;\">If <\/span>.Search(Search, ret, sCols)<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">Debug.Print<\/span> <span style=\"color:blue;\">Replace<\/span>(sCols, \";\", vbTab)\r\n                 For i = 0 To <span style=\"color:blue;\">UBound<\/span>(ret, 2)\r\n                     For j = 0 To <span style=\"color:blue;\">UBound<\/span>(ret, 1)\r\n                         <span style=\"color:blue;\">Debug.Print<\/span> ret(j, i),\r\n                     <span style=\"color:blue;\">Next<\/span> j\r\n                     <span style=\"color:blue;\">Debug.Print<\/span>\r\n                 <span style=\"color:blue;\">Next<\/span> i\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die Verwendung des Klassenmoduls clsEverything demonstriert diese Test-Routine<\/span><\/b><\/p>\n<p>Damit die Klasse funktioniert muss eine Instanz von <b>Everything<\/b> bereits auf dem Rechner laufen. Haben Sie es als Service installiert oder eine Verkn&uuml;pfung zur <b>everything.exe<\/b> in den <b>Autostart<\/b>-Ordner von Windows gelegt, so ist dies bereits gew&auml;hrleistet. Dann k&ouml;nnen Sie die erste Zeile der Prozedur l&ouml;schen oder auskommentieren.<\/p>\n<p>Die n&auml;mlich startet die im Datenbankverzeichnis befindliche <b>VBScript<\/b>-Datei <b>starteverything.vbs<\/b> &uuml;ber die API-Anweisung <b>ShellExecute<\/b>. Vielleicht kommt Ihnen das seltsam vor, weist doch <b>VBScript<\/b> keinerlei Methoden auf, die VBA selbst nicht auch enthielte. Man k&ouml;nnte also die Zeilen des Skripts ja auch in ein VBA-Modul schreiben<\/p>\n<p>Tats&auml;chlich gibt es damit ein Problem: <b>Everything<\/b> soll mit erh&ouml;hten Administratorrechten laufen. Ein Start aus Access heraus w&uuml;rde dies nicht gew&auml;hrleisten k&ouml;nnen, da Access selbst nur unter Benutzerrechten l&auml;uft. Diesem Umstand hilft das Skript ab. Aus Platzgr&uuml;nden listen wir es hier nicht auf, erl&auml;utern jedoch dessen Funktionsweise. Der Trick ist n&auml;mlich, dass das Skript automatisch zweimal startet. Es ruft sich selbst auf, nachdem es &uuml;ber das <b>WMI<\/b>, je nach Betriebssystem, erfahren hat, wo sich die f&uuml;r die Skript-Ausf&uuml;hrung verantwortliche Datei <b>wscript.exe<\/b> befindet.<\/p>\n<p>Und die wird dann ein zweites Mal ausgef&uuml;hrt, wobei nun als Argument ein <b>runas<\/b> &uuml;bergeben wird. Das weist den Kommandozeileninterpreter an, das Skript mit erh&ouml;hten Rechten zu startet. Es kommt nun zum <b>UAC-Prompt<\/b>. In der Folge ermittelt die Routine den Ort zur <b>everything.exe<\/b> und startet eine Instanz derselben unter Zuhilfenahme des <b>Windows Scripting Host <\/b>und der Methode <b>Run<\/b>. <b>Everything<\/b> ist nun automatisch mit Admin-Rechten gestartet. Das Skript findet dabei selbst&auml;ndig heraus, ob die <b>32-Bit<\/b>&#8211; oder die <b>64-Bit-Version<\/b> von <b>Everything<\/b> installiert ist. Nach diesem Start kann die Klasse <b>clsEverything<\/b> in Gestalt der Objektvariablen <b>C<\/b>, auf die ein <b>With<\/b>-Block gesetzt wird, in Aktion treten.<\/p>\n<p>Mit der Eigenschaft <b>Ready<\/b> ermittelt die Prozedur erst, ob <b>Everything<\/b> als Prozess auch wirklich korrekt ansprechbar ist. Dann werden einige Suchoptionen eingestellt. <b>CaseSensitive<\/b> steht auf <b>False<\/b>, wodurch nicht zwischen Gro&szlig;- und Kleinschreibung unterschieden wird. Die maximale Anzahl an R&uuml;ckgabewerten (<b>ResultLimit<\/b>) wird auf <b>2.000<\/b> festgelegt. Das ist f&uuml;r diesen Testaufruf eigentlich nicht notwendig, da Sie wohl kaum mehr Dateien mit dem Namen <b>mscomctl.ocx<\/b> finden werden. (Bei mir waren es aber immerhin 94.)<\/p>\n<p>&uuml;bergeben Sie jedoch im Parameter <b>Search<\/b> der Prozedur etwa <b>*.jpg<\/b>, so ist die Wahrscheinlichkeit gro&szlig;, dass dieses Limit &uuml;berschritten wird. Dann stehen im Ergebnis nur die ersten <b>2.000<\/b> gefunden JPEG-Dateien.<\/p>\n<p>Die n&auml;chste Einstellung ist da schon wichtiger. <b>ResultProperties<\/b> k&ouml;nnen Sie eine Kombination der im Klassenmodul definierten Enumerationskonstanten <b>eEVERYTHING_REQUEST<\/b> &uuml;bergeben. Die steuern, was alles im Ergebnis enthalten sein soll. Die Standardeinstellung ist <b>FULL_PATH_AND_FILE_NAME<\/b>, die alle Dateien oder Ordner mit vollem Pfad zur&uuml;ckgibt. Weitere Angaben fehlen. Mit der zus&auml;tzlichen Einstellung <b>DATE_CREATED<\/b> weist das Ergebnis dann eine zus&auml;tzliche Spalte mit dem Erstelldatum der Dateien auf.<\/p>\n<p><b>ShowMessages<\/b> weist an, dass etwaige Fehlermeldungen ausgegeben werden sollen. Die Sortierung des Ergebnisses geschieht aufsteigend nach Namen, weil dies in <b>SortOrder<\/b> so eingestellt ist. Statt <b>PATH_ASCENDING<\/b> k&ouml;nnen Sie eine Menge anderer Sortierungen angeben. Mit <b>SIZE_DESCENDING<\/b> etwa w&uuml;rden die Ergebnisse absteigend nach Gr&ouml;&szlig;e der Dateien sortiert. <\/p>\n<p>Nach dieser (optionalen) Einstellung der Sucheigenschaften geht es mit dem Aufruf der Methode <b>Search<\/b> erst wirklich zur Sache. Dieser &uuml;bergeben Sie im ersten Parameter den Suchausdruck, im zweiten ein Variant-Array (<b>ret<\/b>) und im dritten eine String-Variable <b>sCols<\/b>, welche die ermittelten Spalten im Ergebnis wiederspiegeln wird. Das Klassenmodul f&uuml;llt diesen String selbst und gibt in unserem Beispiel &uuml;ber <b>Debug.Print<\/b> dies aus:<\/p>\n<pre>Kind; Path; File; DateCreated<\/pre>\n<p>Die erste Ergebnisspalte enth&auml;lt demnach die Eigenschaft <b>Kind<\/b> der Dateien. Das ist ein Dateiattribut, welches aus einem Buchstaben besteht. Mit <b>F<\/b> ist eine Datei gekennzeichnet (<b>File<\/b>), mit <b>D<\/b> ein Ordner (<b>Directory<\/b>) und mit <b>V<\/b> ein Laufwerk (<b>Volume<\/b>). <b>Path<\/b> verweist auf den Dateipfad, <b>File<\/b> auf den Dateinamen. <b>DateCreated<\/b> gibt in der letzten Spalte das Erstelldatum aus. N&uuml;tzlich ist dieser String dann, wenn Sie die Elemente des R&uuml;ckgabe-Arrays etwa den Spalten einer Tabelle zuordnen m&ouml;chten, wie wir noch sehen werden.<\/p>\n<p>Das in <b>ret<\/b> zur&uuml;ckgegebene Array ist damit zweidimensional. Die zweite mit <b>UBound(ret, 2)<\/b> ermittelte Dimension ist die Anzahl der Zeilen, die erste die Zahl der Spalten darin. Zwei verschachtelte Schleifen mit den Z&auml;hlern <b>i<\/b> und <b>j<\/b> auf diese Dimensionen durchlaufen nun das Array und geben die Werte im Direktfenster aus. Das abschlie&szlig;ende Komma in <b>Debug.Print<\/b> weist VBA an, den n&auml;chsten Eintrag jeweils an die n&auml;chste TAB-Position zu stellen. Nach der inneren Schleife f&uuml;hrt das <b>Debug.Print<\/b> ohne Parameter hingegen zum Zeilenumbruch.<\/p>\n<p><!--30percent--><\/p>\n<p>Im Test dauerte der Aufruf von <b>Search<\/b> etwa ein bis zwei Sekunden. Vergegenw&auml;rtigen Sie sich, dass dabei das komplette Dateisystem durchsucht wird! Am schnellsten geschieht das, wenn Sie lediglich die Dateipfade zur&uuml;ckgeben lassen. Mit jedem weiteren Parameter steigt die Rechenzeit an. Besonders kritisch ist das beim Einsatz der Suchoption <b>SIZE<\/b>, die auch die Gr&ouml;&szlig;e der Dateien ermittelt. Das &uuml;bernimmt im Klassenmodul n&auml;mlich nicht <b>Everything<\/b> selbst, sondern eine Hilfsfunktion. W&uuml;rden Sie als Suchausdruck etwa <b>*.* <\/b>angeben, so m&uuml;sste f&uuml;r alle zwei Millionen im System gefundenen Dateien deren Gr&ouml;&szlig;e ermittelt werden &#8211; vorausgesetzt, Sie h&auml;tten f&uuml;r <b>ResultLimit<\/b> einen entsprechenden Wert angegeben.<\/p>\n<p>Abgesehen davon, dass ein Array mit 2 Millionen Werten wohl den Speicher von VBA sprengen w&uuml;rde, d&uuml;rfte die Ermittlung dieser Dateigr&ouml;&szlig;en locker eine Stunde ben&ouml;tigen. Ausprobiert haben wir das nicht.<\/p>\n<p><b>ResultLimit<\/b> ist &uuml;brigens auf <b>100.000<\/b> voreingestellt, wenn Sie die Eigenschaft nicht selbst setzen. Trotz der Performance von <b>Everything<\/b> kann die Ermittlung des Ergebnisses, je nach Situation, etwas dauern, weshalb es sich im Zweifel gut macht, vor dem Aufruf von <b>Search<\/b> ein <b>DoCmd.Hourglass True<\/b> abzusetzen, um die Sanduhr erscheinen zu lassen.<\/p>\n<h2>Klassenmodul clsEverything<\/h2>\n<p>Die Hauptaufgabe des Moduls ist die &uuml;bersetzung der <b>C-Header<\/b> von <b>Everything<\/b> nach VBA. Im Kopf finden Sie deshalb eine Menge von Konstantendefinitionen und API-Deklarationen. Die werden dann von den Prozeduren des Moduls verwendet. Au&szlig;erhalb des Moduls brauchen Sie sich keine Gedanken &uuml;ber diese API-Deklarationen zu machen, die ja auch alle als <b>Private<\/b> daherkommen.<\/p>\n<p>Im <b>Initialize<\/b>-Ereignis der Klasse (siehe Listing 2) werden einige Voreinstellungen f&uuml;r die Suche vorgenommen. Das Ergebnis-Limit steht auf <b>100.000<\/b>, die R&uuml;ckgabespalten bestehen nur aus Pfad und Name der Datei, die Sortierung geschieht nach Namen, und zwischen Gro&szlig;- und Kleinschreibung soll nicht unterschieden werden. Diese Einstellungen speichern die <b>Member<\/b>-Variablen des Moduls, welche namentlich jeweils mit <b>m_<\/b> beginnen. <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Class_Initialize()\r\n     m_sort = EVERYTHING_SORT_PATH_ASCENDING\r\n     m_requestprops = EVERYTHING_REQUEST_FILE_NAME Or _\r\n         EVERYTHING_REQUEST_PATH\r\n     m_msg = <span style=\"color:blue;\">True<\/span>\r\n     m_limit = 100000\r\n     m_case = <span style=\"color:blue;\">False<\/span>\r\n     \r\n     h<span style=\"color:blue;\">Mod<\/span> = GetModuleHandle(\"everything32\")\r\n     <span style=\"color:blue;\">If <\/span>h<span style=\"color:blue;\">Mod<\/span> = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(CurrentProject.Path & \"\\everything32.dll\")) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> _\r\n                 \"Die Datei everything32.dll muss im Datenbankverzeichnis liegen!\", _\r\n                 <span style=\"color:blue;\">vbCr<\/span>itical, \"Everything\"\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             h<span style=\"color:blue;\">Mod<\/span> = LoadLibrary(CurrentProject.Path & \"\\everything32.dll\")\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Im Initialize-Ereignis werden Suchparameter voreingestellt und die everything-DLL geladen<\/span><\/b><\/p>\n<p>Damit die API-Deklarationen greifen, muss die f&uuml;r die Kommunikation mit Everything verantwortliche Datei <b>everything32.dll<\/b> geladen werden. Das muss nur einmal geschehen. <b>GetModuleHandle<\/b> fragt ab, ob das Modul bereits im Prozessraum von Access steht. Dann ist alles ok und <b>hMod<\/b> ist ungleich Null. Ansonsten schaut die Routine erst einmal nach, ob die <b>everything32.dll <\/b>&uuml;berhaupt im Datenbankverzeichnis liegt (<b>CurrentProject.Path<\/b>), was die Voraussetzung f&uuml;r die Klasse ist. Sie k&ouml;nnen diesen Zweig nat&uuml;rlich modifizieren und die DLL etwa in einem anderen Verzeichnis unterbringen. Ist die Datei vorhanden, so l&auml;dt <b>LoadLibrary<\/b> sie und speichert das erhaltene <b>Modul-Handle<\/b> in <b>hMod<\/b>.<\/p>\n<p>Selbst dann, wenn die DLL geladen ist, muss zus&auml;tzlich &uuml;berpr&uuml;ft werden, ob das Anwendungsfenster von <b>Everything<\/b> schon aufgebaut ist. &uuml;ber dieses Fenster geschieht n&auml;mlich die Kommunikation in Form von <b>IPC-Messages<\/b>. Sichtbar muss es dazu allerdings nicht sein. Es reicht, wenn <b>Everything<\/b> als Icon im <b>Tray<\/b> zu finden ist. Die Eigenschaft <b>Ready<\/b> des Klassenmoduls sucht nun erst nach dem Fenster und anschlie&szlig;end nach dem Zustand von <b>Everything<\/b>, welcher &uuml;ber die API-Funktion <b>Everything_IsDBLoaded<\/b> abgefragt werden kann. Starten Sie <b>Everything<\/b> etwa &uuml;ber das besprochene <b>VBS-Script<\/b>, so beginnt <b>Everything<\/b> zun&auml;chst mit der Indizierung der modifizierten Dateien des Systems, um diese &auml;nderungen in seiner Datenbank abzulegen. Das kann einige Zeit in Anspruch nehmen und erst nach Ablauf dieser gibt <b>Everything_IsDBLoaded<\/b> einen anderen Wert aus, als Null:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>Everything_IsDBLoaded<span style=\"color:blue;\"> Then<\/span>\r\n     Ready = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">Else<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Die Everything-Datenbank ist noch nicht\" & _\r\n        \"vollst&auml;ndig geladen. Bitte sp&auml;ter nochmals \" & _\r\n        \"versuchen.\", <span style=\"color:blue;\">vbCr<\/span>itical, \"Everything\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Die ganzen <b>Property<\/b>-Prozeduren des Moduls &uuml;bernehmen im Wesentlichen die Aufgabe, die &uuml;bergebenen Parameter in <b>Member<\/b>-Variablen abzuspeichern, die dann erst beim Aufruf von <b>Search<\/b> ausgewertet werden. Und diese Prozedur ist das Kernst&uuml;ck des Moduls. Deklariert ist sie so:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>Search( _\r\n     ByVal QueryString<span style=\"color:blue;\"> As String<\/span>, _\r\n     ResultSet()<span style=\"color:blue;\"> As Variant<\/span>, _\r\n     ByRef Columns<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>In <b>QueryString<\/b> &uuml;bergeben Sie den Suchausdruck, in <b>ResultSet<\/b> das undimensionierte R&uuml;ckgabe-Array vom Typ <b>Variant<\/b>, und in <b>Columns<\/b> eine String-Variable, die anschlie&szlig;end die Spalten des Ergebnisses enth&auml;lt. G&uuml;ltig ist das Ergebnis indessen nur dann, wenn die Funktion <b>True<\/b> zur&uuml;ckgibt. Haben Sie etwa <b>ShowMessages<\/b> auf <b>False<\/b> eingestellt, dann unterbleiben Fehlermeldungen. In diesem Fall gibt nur der R&uuml;ckgabewert der Funktion Aufschluss &uuml;ber den Erfolg der Suche.<\/p>\n<p>In der Testprozedur von <b>Listing 1<\/b> wird dieser R&uuml;ckgabewert auch ausgewertet.<\/p>\n<p><b>Search<\/b> stellt nun anhand der &uuml;ber die Eigenschaft <b>ResultProperties<\/b> eingestellten Suchoptionen &uuml;ber die <b>Member<\/b>-Variable <b>m_requestprops<\/b> die Spalten des Ergebnisses zusammen:<\/p>\n<pre>Columns = \"Kind;Path;File;\" \r\n<span style=\"color:blue;\">If <\/span>(m_requestprops And REQUEST_EXTENSION)<span style=\"color:blue;\"> Then<\/span>\r\n     bExt = True: Columns = Columns & \"Extension;\"\r\n<span style=\"color:blue;\">If <\/span>(m_requestprops And REQUEST_DATE_CREATED)<span style=\"color:blue;\"> Then<\/span> \r\n      bDateCr = True: Columns = Columns & \"DateCreated;\"\r\n<span style=\"color:blue;\">If <\/span>(m_requestprops And REQUEST_DATE_MODIFIED)<span style=\"color:blue;\"> Then<\/span>\r\n     bDate<span style=\"color:blue;\">Mod<\/span> = True: Columns = Columns & \"DateModified;\"\r\n...<\/pre>\n<p>Die Boolean-Variablen <b>bExt<\/b>, <b>bDateCr<\/b>, <b>bDateMod<\/b> et cetera steuern den weiteren Ablauf in der Prozedur. Der Suchausdruck wird nun an <b>Everything<\/b> &uuml;bergeben:<\/p>\n<pre>Everything_SetSearchW (StrPtr(QueryString))\r\nret = Everything_QueryW(1)<\/pre>\n<p><b>QueryW<\/b> ermittelt hier, ob der &uuml;bergebene Suchausdruck korrekt ist und den Spezifikationen von <b>Everything<\/b> gen&uuml;gt. Nur dann steht der R&uuml;ckgabewert in <b>ret<\/b> auf <b>1<\/b>. Tats&auml;chlich f&uuml;hrt dieser Aufruf bereits zur Suche und das Ergebnis kann anschlie&szlig;end ausgewertet werden:<\/p>\n<pre>cnt = Everything_GetNumResults<\/pre>\n<p>In <b>cnt<\/b> steht jetzt die Zahl der ermittelten Dateien oder Ordner. Ist sie gleich <b>0<\/b>, so wird die Prozedur verlassen. Andernfalls f&auml;hrt Sie mit der &uuml;berf&uuml;hrung der Ergebnisse in das Array <b>ResultSet<\/b> fort:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>cnt &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n     Search = True: ReDim ResultSet(n - 1, cnt - 1)\r\n     For i = 0 To cnt - 1\r\n         (...)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Das Array wird anhand der Ergebniszahl <b>cnt<\/b> dimensioniert. Das gilt f&uuml;r die zweite Dimension. Die erste bestimmt die Zahl der Spalten, die vorher in <b>n<\/b> bei der Zusammenstellung derselben ermittelt wurde.<\/p>\n<p>Den Dateinamen erh&auml;lt die Routine nun etwa so:<\/p>\n<pre>sFile = String(260, 0)\r\nret = Everything_GetResultFullPathNameW( _\r\n            i, StrPtr(sFile), 260&)\r\n<span style=\"color:blue;\">If <\/span>ret &gt; 0<span style=\"color:blue;\"> Then<\/span> sFile = <span style=\"color:blue;\">Left<\/span>(sFile, ret)<\/pre>\n<p>Die String-Variable <b>sFile<\/b> muss zuerst mit <b>Null-Characters<\/b> gef&uuml;llt werden, wie dies h&auml;ufig bei API-Funktionen erforderlich ist. Der String wird nicht direkt &uuml;bergeben, sondern als Zeiger per <b>StrPtr<\/b>. In <b>ret<\/b> steht dann die Buchstabenzahl, die die API-Funktion errechnete. <b>Left<\/b> schneidet die nun &uuml;berfl&uuml;ssigen <b>Null-Characters<\/b> ab.<\/p>\n<p>&uuml;brigens f&auml;hrt die Prozedur mit den weiteren Schritten grunds&auml;tzlich nur dann fort, wenn <b>ret<\/b> hier auf <b>>0<\/b> steht. Denn der Datei- oder Ordnername sind das Mindeste, was im Ergebnis auftauchen muss.<\/p>\n<p>Soll auch das Erstelldatum abgefragt werden, so tritt dieser Zweig in Aktion:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>bDateCr<span style=\"color:blue;\"> Then<\/span>\r\n     ret = Everything_GetResultDateCreated(i, FilTime)\r\n     <span style=\"color:blue;\">If <\/span>ret &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         ResultSet(col, i) = APITimeToDate(FilTime)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     col = col + 1\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Die API-Funktion f&uuml;llt eine Variable <b>FillTime<\/b> des benutzerdefinierten Typs <b>FILETIME<\/b>, der erst mit der Hilfsfunktion <b>APITimeToDate<\/b> im Modul in ein VBA-Datum &uuml;berf&uuml;hrt wird. Der Spaltenz&auml;hler <b>col<\/b> erh&ouml;ht sich nun.<\/p>\n<p>Der Zeilenz&auml;hler <b>i<\/b> wird, wie Sie sehen, jeweils den API-Funktionen von <b>Everything<\/b> als erstes Argument &uuml;bergeben. F&uuml;r alle weiteren Funktionen gilt dieser Grundsatz ebenso.<\/p>\n<p>Der Long-Wert <b>i<\/b> ist quasi der Index auf einen Wert, den <b>Everything<\/b> in seinem Speicher f&uuml;r das Suchergebnis abgelegt hatte. Nach Durchlaufen aller Werte in der Schleife auf <b>i<\/b> ist das R&uuml;ckgabe-Array <b>ResultSet<\/b> gef&uuml;llt und die Routine kann verlassen werden.<\/p>\n<p>Kurz sei noch auf die Hilfsfunktion eingegangen, welche die Gr&ouml;&szlig;e der Dateien ebenfalls per <b>API<\/b> ermittelt:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>FileSize(ByVal sFilePath<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Currency<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>hFile<span style=\"color:blue;\"> As Long<\/span>, nSize<span style=\"color:blue;\"> As Currency<\/span>\r\n     \r\n     hFile = CreateFile(sFilePath, &H80000000, 1&, _\r\n                ByVal 0&, 3&, ByVal 0&, ByVal 0&)\r\n     <span style=\"color:blue;\">If <\/span>hFile &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         GetFileSizeEx hFile, nSize\r\n         CloseHandle hFile\r\n         FileSize = nSize * 10000\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Warum braucht es hier eine spezielle Funktion, um die Dateigr&ouml;&szlig;e zu ermitteln, obwohl doch VBA mit <b>FileLen<\/b> schon eine solche mitbringt Ganz einfach: Unter Access <b>32-Bit<\/b> kann <b>FileLen<\/b> nur Long-Werte bis etwa <b>2 GB<\/b> speichern.<\/p>\n<p>Bei gr&ouml;&szlig;eren Dateien gibt es ein falschen Wert aus, der quasi durch <b>Modulo<\/b> auf <b>2^32<\/b> zustande kommt. Nur die API-Funktion <b>GetFileSizeEx<\/b> kann gr&ouml;&szlig;ere Werte abfragen, indem es sie in 8 Byte abspeichert, was dem VBA-Typ <b>Currency<\/b> entspricht.<\/p>\n<p>Es ist nun auch klar, warum des Ergebnis-Array von Typ <b>Variant<\/b> sein muss: Die Elemente k&ouml;nnen jeweils vom Typ <b>String<\/b>, <b>Date<\/b>, <b>Long<\/b> oder <b>Currency<\/b> sein. Sie k&ouml;nnen nun die VBA-Funktionen <b>Typename<\/b> oder <b>VarType<\/b> daf&uuml;r nutzen, um etwa den Datentyp zu bestimmen, der f&uuml;r das Abspeichern der Ergebnisse in eine Tabelle erforderlich ist.<\/p>\n<h2>Beispielformular f&uuml;r den Einsatz des Klassenmoduls<\/h2>\n<p>Nat&uuml;rlich k&ouml;nnen Sie die Klasse direkt in Modulen f&uuml;r beliebige Zwecke verwenden. Das Beispielformular <b>frmEverything<\/b> demonstriert aber, wie Sie die Ergebnisse in einer Tabelle unterbringen und anzeigen lassen k&ouml;nnen. Im oberen Teil des Formulars (siehe Bild 2) geben Sie in das Textfeld (<b>Everything Filter<\/b>) den Suchausdruck ein. Mit <b>Max. results<\/b> beschr&auml;nken Sie die Zahl der Ergebnisse. Die Checkboxen k&ouml;nnen Sie einzeln aktivieren. Sie f&uuml;hren dazu, dass nach Klick auf <b>OK<\/b> in der Ergebnisliste unten sich zus&auml;tzliche Spalten mit den entsprechenden Angaben einblenden. Diese Liste stellt ein Unterformular, welches &uuml;ber eine Abfrage auf der Tabelle <b>tblEverything<\/b> basiert. Bild 3 zeigt das Suchergebnis f&uuml;r alle gefundenen <b>JPG<\/b>-Dateien im System. Am Datensatzz&auml;hler des Unterformulars k&ouml;nnen Sie ablesen, dass dies mehr sind, als das eingestellte Limit von <b>50.000<\/b> erlaubt. Sie m&uuml;ssten diesen Wert heraufsetzen, um wirklich alle <b>JPG<\/b>-Dateien zu ermitteln.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_04\/frmEverything2.png\" alt=\"Nach dem Klick auf OK f&uuml;llt sich die Ergebnisliste mit allen gem&auml;&szlig; dem angegebenen Filterausdruck gefundenen Dateien.\" width=\"700\" height=\"305,414\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Nach dem Klick auf OK f&uuml;llt sich die Ergebnisliste mit allen gem&auml;&szlig; dem angegebenen Filterausdruck gefundenen Dateien.<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_04\/frmEverything1.png\" alt=\"So pr&auml;sentiert sich das Formular frmEverything mit seinem Suchfeld und verschiedenen Suchoptionen initial nach dem &ouml;ffnen \" width=\"700\" height=\"305,414\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: So pr&auml;sentiert sich das Formular frmEverything mit seinem Suchfeld und verschiedenen Suchoptionen initial nach dem &ouml;ffnen <\/span><\/b><\/p>\n<p>G&uuml;nstiger ist es jedoch, die Ergebnismenge durch einen anderen Suchausdruck einzugrenzen, wie in Bild 4, wo nur <b>JPG<\/b>-Dateien gefunden werden sollen, die den String <b>stone<\/b> enthalten. Damit reduziert sich das Ergebnis auf <b>112<\/b> Datens&auml;tze. Hier sind &uuml;brigens die Checkboxen f&uuml;r <b>DateCreated<\/b> und <b>Size<\/b> aktiviert, wodurch sich die zus&auml;tzlichen Spalten einblenden. Das Unterformular k&ouml;nnen Sie anschlie&szlig;end nat&uuml;rlich &uuml;ber das Kontextmen&uuml; des Spaltenkopfs weiter nach Belieben sortieren oder filtern, wie &uuml;blich. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_04\/frmEverything3.png\" alt=\"Sind oben bestimmte Checkboxen aktiviert, so blendet die Ergebnisliste weitere Spalten mit den gew&uuml;nschten Informationen ein.\" width=\"700\" height=\"387,6557\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Sind oben bestimmte Checkboxen aktiviert, so blendet die Ergebnisliste weitere Spalten mit den gew&uuml;nschten Informationen ein.<\/span><\/b><\/p>\n<p>Den Entwurf des Formulars demonstriert Bild 5. Neben den Checkboxen und dem Textfeld enth&auml;lt es f&uuml;r die Ergebnisliste das Unterformular <b>sfrmResults<\/b>, welches fest an die Abfrage <b>qry_Everything<\/b> gebunden ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_04\/frmEverythingDS.png\" alt=\"Das Formular in der Entwurfsansicht\" width=\"700\" height=\"339,6806\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Formular in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Die Tabelle <b>tblEverything<\/b> hat den Aufbau in Bild 6. Hier sind f&uuml;r alle m&ouml;glichen Informationen, die die Klasse <b>clsEverything<\/b> zu einer Datei liefern kann, Datenfelder des passenden Typs vorgesehen. Sie erkennen etwa, dass die Gr&ouml;&szlig;e einer Datei (<b>Size<\/b>) den Datentyp W&auml;hrung (<b>Currency<\/b>) aufweist, um auch Gr&ouml;&szlig;en jenseits der <b>2 GB<\/b>-Grenze anzeigen zu k&ouml;nnen. Die Tabelle wird allerdings nicht direkt als Unterformular in das Hauptformular eingebunden, sondern &uuml;ber eine einfache Abfrage <b>qry_Everything<\/b>:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_04\/tblEverythingDS.png\" alt=\"Entwurf der Tabelle tblEverything zur Zwischenspeicherung der Suchergebnisse f&uuml;r das Formular\" width=\"650\" height=\"408,3477\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurf der Tabelle tblEverything zur Zwischenspeicherung der Suchergebnisse f&uuml;r das Formular<\/span><\/b><\/p>\n<pre>SELECT Kind, Path, File FROM tblEverything<\/pre>\n<p>Im Grundzustand erscheinen damit im Ergebnis nur die Spalten f&uuml;r die Dateiart, den Pfad und den Dateinamen.<\/p>\n<p>Aufgabe des Formularmoduls ist es nun einerseits, den Suchausdruck und die Suchoptionen an eine Instanz der Klasse <b>clsEverything<\/b> zu leiten und andererseits das Suchergebnis in die Tabelle <b>tblEverything<\/b> abzuspeichern.   Zudem muss es f&uuml;r die Anzeige der Spalten im Unterformular gegebenenfalls die Abfrage <b>qry_Everything<\/b> modifizieren.<\/p>\n<p>Die Tabelle <b>tblEverything<\/b> wird beim Entladen des Formulars automatisch geleert. M&ouml;chten Sie ihren Inhalt dennoch einsehen, so &ouml;ffnen Sie diese einfach zur Laufzeit des Formulars und nach Ausf&uuml;hrung einer Suchanfrage im Navigationsfenster. Das k&ouml;nnte dann etwa so aussehen, wie in Bild 7. Hier wurden die Checkboxen f&uuml;r <b>DateCreated<\/b> und <b>Size<\/b> aktiviert, weshalb neben den Standardspalten nun auch nur diese gef&uuml;llt sind und die anderen Datenfelder leer bleiben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_04\/tblEverythingRT.png\" alt=\"Zur Laufzeit des Formulars k&ouml;nnen Sie den Inhalt der Tabelle tblEverything mit den selektiv gef&uuml;llten Spalten einsehen\" width=\"700\" height=\"169,2126\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Zur Laufzeit des Formulars k&ouml;nnen Sie den Inhalt der Tabelle tblEverything mit den selektiv gef&uuml;llten Spalten einsehen<\/span><\/b><\/p>\n<p>Bei den Suchoptionen gibt es zwei, die der Erl&auml;uterung bed&uuml;rfen. <b>Run Count<\/b> wird normalerweise nur bei ausf&uuml;hrbaren Dateien erscheinen und gibt dann aus, wie oft ein Prozess dieser von <b>Everything<\/b> aus auf dem System ausgef&uuml;hrt wurde &#8211; also von seiner <b>GUI<\/b> aus. <b>DateLastRun<\/b> ist ebenfalls damit verkn&uuml;pft und gibt aus, wann der Prozess das letzte Mal gestartet war. Die beiden Optionen werden Sie wohl selten brauchen.<\/p>\n<p>Soweit zur Anwendung des Formulars. Die Prozeduren des Formularmoduls, welches lediglich 78 Code-Zeilen umfasst, sehen wir uns nun genauer an. Beim Laden und Entladen des Formulars laufen diese beiden Ereignisprozeduren ab:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>cEverything<span style=\"color:blue;\"> As <\/span>clsEverything\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> cEverything = <span style=\"color:blue;\">New<\/span> clsEverything\r\n     Me.Caption = \"Everything V \" & cEverything.Version\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Set<\/span> cEverything = Nothing\r\n     CurrentDb.Execute \"DELETE FROM tblEverything\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Eine Objektvariable <b>cEverything<\/b> nimmt in <b>Form_Load<\/b> eine Instanz der Klasse <b>clsEverything<\/b> entgegen. Die Versionsnummer des installierten <b>Everything<\/b> wird in der Titelzeile des Formulars angezeigt. Beim Entladen (<b>Form_Unload<\/b>) wird die Objektvariable dereferenziert und die Tabelle <b>tblEverything<\/b> &uuml;ber die <b>Execute<\/b>-Anweisung geleert. Au&szlig;er diesen beiden existiert im Modul nur noch eine weitere Prozedur <b>cmdOK_Click<\/b>, die auf den <b>OK<\/b>-Button <b>cmdOK<\/b> reagiert. Listing 3 zeigt diese Prozedur in leicht gek&uuml;rzter Version.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>arrRet()<span style=\"color:blue;\"> As Variant<\/span>, sCols<span style=\"color:blue;\"> As String<\/span>, arrCols()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>sSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>, j<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lRequest<span style=\"color:blue;\"> As <\/span>eEVERYTHING_REQUEST\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>QueryDef, rs<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     \r\n     <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n     <span style=\"color:blue;\">With<\/span> cEverything\r\n         <span style=\"color:blue;\">If <\/span>.Ready<span style=\"color:blue;\"> Then<\/span>\r\n             .CaseSensitive = Me!chkSensitive.Value\r\n             .ResultLimit = CLng(Me!txtMax.Value)\r\n             lRequest = EVERYTHING_REQUEST_FILE_NAME Or EVERYTHING_REQUEST_PATH\r\n             <span style=\"color:blue;\">If <\/span>Me!chkAttr.Value = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span> lRequest = lRequest Or EVERYTHING_REQUEST_ATTRIBUTES\r\n             (...)\r\n             <span style=\"color:blue;\">If <\/span>Me!chkSize.Value = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span> lRequest = lRequest Or EVERYTHING_REQUEST_SIZE\r\n             .ResultProperties = lRequest\r\n             .SortOrder = EVERYTHING_SORT_PATH_ASCENDING\r\n             DoCmd.Hourglass True: DoEvents\r\n             <span style=\"color:blue;\">If <\/span>.Search(Nz(Me!txtQuery.Value), arrRet, sCols)<span style=\"color:blue;\"> Then<\/span>\r\n                 sCols = <span style=\"color:blue;\">Left<\/span>(sCols, <span style=\"color:blue;\">Len<\/span>(sCols) - 1)\r\n                 arrCols = <span style=\"color:blue;\">Split<\/span>(sCols, \";\")\r\n                 \r\n                 <span style=\"color:blue;\">Set<\/span> qdf = CurrentDb.QueryDefs(\"qry_Everything\")\r\n                 qdf.SQL = \"SELECT \" & <span style=\"color:blue;\">Replace<\/span>(sCols, \";\", \",\") & \" FROM tblEverything\"\r\n                 CurrentDb.Execute \"DELETE FROM tblEverything\"\r\n                 <span style=\"color:blue;\">Set<\/span> rs = CurrentDb.OpenRecordset(\"SELECT * FROM tblEverything\", dbOpenDynaset)\r\n                 For i = 0 To <span style=\"color:blue;\">UBound<\/span>(arrRet, 2)\r\n                     rs.Add<span style=\"color:blue;\">New<\/span>\r\n                     For j = 0 To <span style=\"color:blue;\">UBound<\/span>(arrCols)\r\n                         rs.Fields(arrCols(j)).Value = arrRet(j, i)\r\n                     <span style=\"color:blue;\">Next<\/span> j\r\n                     rs.Update\r\n                 <span style=\"color:blue;\">Next<\/span> i\r\n                 rs.Close\r\n                 Me!sfrmResults.SourceObject = \"Query.qry_Everything\": Me!sfrmResults.Requery\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             DoCmd.Hourglass <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Exit Sub<\/span>\r\n     \r\nFehler:\r\n     DoCmd.Hourglass <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> Err.Description, <span style=\"color:blue;\">vbCr<\/span>itical, \"fmrEverything\/cmdOK_Click\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Diese Test-Routine l&auml;sst die Windows-Fortschrittsanzeige erscheinen und wieder verschwinden<\/span><\/b><\/p>\n<p>Nach der Abfrage auf <b>Ready<\/b>, ob die Klasse auch einsatzbereit ist, stellen sich die Eigenschaften des Klassenobjekts auf die Optionen ein, die sich aus den Checkboxen des Formulars ergeben. Die Ergebnisbegrenzung <b>ResultLimit<\/b> etwa kommt aus dem Textfeld <b>txtMax<\/b>, Gro&szlig;- und Kleinschreibung (<b>CaseSensitive<\/b>) aus der Checkbox <b>chkSensitive<\/b>. Etwas komplexer ist die Zusammenstellung der <b>ResultProperties<\/b> &uuml;ber die Long-Variable <b>lRequest<\/b>.<\/p>\n<p>Je nach Zustand der zugeh&ouml;rigen Checkboxen m&uuml;ssen die Enumerationskonstanten aus <b>eEVERYTHING_REQUEST<\/b> der Klasse aufaddiert werden. Im Listing sind nur jene f&uuml;r die Checkboxen <b>chkAttr<\/b> und <b>chkSize<\/b> wiedergegeben, die die Ausgabe der Dateiattribute und -gr&ouml;&szlig;en steuern. Dier Auswertung der anderen ist durch das <b>(&#8230;)<\/b> symbolisiert. Ist eine Checkbox aktiviert (<b>True<\/b>), dann wird in <b>lRequest<\/b> die passende Konstante per <b>OR<\/b> kombiniert. Anschlie&szlig;end wird der kombinierte Wert an die Eigenschaft <b>ResultProperties<\/b> weitergegeben.<\/p>\n<p>Schlie&szlig;lich kommt es zum Aufruf von <b>Search<\/b>, was die Suche in <b>Everything<\/b> erst anst&ouml;&szlig;t. Falls dieser erfolgreich ausgeht, so sind das Ergebnis-Array <b>arrRet<\/b> und der Spalten-String <b>sCols<\/b> gef&uuml;llt. Dieser String wird dann mit der <b>Split<\/b>-Funktion ebenfalls in ein String-Array <b>arrCols<\/b> &uuml;berf&uuml;hrt.  Wird ben&ouml;tigen dieses sp&auml;ter noch f&uuml;r die Zuordnung der Datenfelder.<\/p>\n<p>Damit das Unterformular nur die gew&uuml;nschten Felder ausgibt, muss nun die zugrundeliegende Abfrage <b>qry_Everything<\/b> modifiziert werden. Eine <b>QueryDef<\/b>-Variable <b>qdf<\/b> wird auf sie gesetzt und dann der <b>SQL<\/b>-Inhalt der Abfrage ge&auml;ndert, indem er aus <b>SELECT &#8230; FROM tblEverything<\/b> und den Spalten in <b>sCols<\/b> zusammengebaut wird. Da dieser String bereits die korrekten Datenfeldnamen enth&auml;lt, m&uuml;ssen per <b>Replace<\/b> nur noch die Semikola durch die in <b>SQL<\/b> zu verwendenden Kommas ausgetauscht werden.<\/p>\n<p>Deshalb ben&ouml;tigen wir f&uuml;r diesen Vorgang nur zwei Zeilen. Damit sich die Anzeige auch dementsprechend &auml;ndert, muss allerdings weiter unten noch das Herkunftsobjekt des Unterformulars <b>sfrmResults<\/b> neu eingestellt werden. Zwar &auml;ndert es sich eigentlich nicht, doch die zus&auml;tzlichen Spalten werden erst nach Absetzen dieser Anweisung eingeblendet. Ein <b>Requery<\/b> allein gen&uuml;gt nicht:<\/p>\n<pre>sfrmResults.SourceObject = \"Query.qry_Everything\"\r\nsfrmResults.Requery<\/pre>\n<p>Die verschachtelten Schleifen auf die Z&auml;hler <b>i<\/b> und <b>j<\/b> legen nun die Datens&auml;tze in der Tabelle <b>tblEverything<\/b> an, was &uuml;ber das <b>Recordset rs<\/b> geschieht. <b>i<\/b> verweist dabei jeweils auf eine Zeile im Ergebnis-Array von <b>clsEverything<\/b>, weshalb hier immer ein neuer Datensatz mit <b>AddNew<\/b> angelegt wird. Die Felder des Datensatzes indessen f&uuml;llen sich &uuml;ber den Z&auml;hler <b>j<\/b> auf die erste Dimension des Ergebnis-Arrays.<\/p>\n<p>Und das muss nicht hartkodiert werden, sondern ergibt sich aus dem Spalten-Array <b>arrCols<\/b>, welches zuvor aus <b>sCols<\/b> erhalten wurde. Der Name eines Datenfelds steht in <b>arrCols(j)<\/b>, der Wert in <b>arrRet(j,i)<\/b>. &uuml;ber die <b>Fields<\/b>-Auslistung des Recordsets k&ouml;nnen damit die Felder angesprochen und mit Werten versehen werden.<\/p>\n<p>Eingerahmt ist das Ganze noch in die Aktivierung der Sanduhr per <b>DoCmd.Hourglass<\/b>. Bei Fehlern in der Code-Ausf&uuml;hrung erscheint ein Meldungsfenster &uuml;ber die Fehlerbehandlung der Prozedur.<\/p>\n<h2>Verwendung der Klasse<\/h2>\n<p>Imgrunde haben wir mit diesem Formular, das die Nutzung des Klassenmoduls demonstrieren sollte, nur die <b>Everything<\/b>-Anwendung rudiment&auml;r nachgebaut. In Ihren Datenbanken werden Sie ein solches Formular wahrscheinlich nicht ben&ouml;tigen.<\/p>\n<p>Vorstellbar sind jedoch beispielsweise folgende Szenarien:<\/p>\n<ul>\n<li>Sie ben&ouml;tigen in Ihrer Datenbank ein bestimmtes Dokument, welches der Anwender in einem unbekannten Verzeichnis abgelegt hatte. &uuml;ber <b>Everything<\/b> finden Sie schnell heraus, wo es sich befindet.<\/li>\n<li>Sie m&ouml;chten ermitteln, ob Access in mehreren Versionen auf den Rechner installiert ist.  &uuml;ber eine Suche nach <b>msaccess.exe<\/b> finden Sie alle vermutlichen Installationspfade.<\/li>\n<li>Ihr Anwender soll aus einem Verzeichnis mit Dokumenten, Bildern, oder gar Mediendateien einige ausw&auml;hlen, die in der Datenbank ben&ouml;tigt werden und dabei auch Unterverzeichnisse ber&uuml;cksichtigen. Mit <b>Everything<\/b> und einem Auswahlformular k&ouml;nnen Sie ihm diese Dateien pr&auml;sentieren. Ein <b>Treeview<\/b> w&uuml;rde dabei die Struktur verdeutlichen k&ouml;nnen.<\/li>\n<li>Sie m&ouml;chten, wie im Beitrag zur registrierungslosen Instanziierung von Objekten geschildert, eine bestimmte <b>ActiveX-DLL<\/b> oder ein <b>OCX<\/b> verwenden. Die Orte, an denen sich die passende Datei befindet, kann <b>Everything<\/b> f&uuml;r Sie auffinden.<\/li>\n<\/ul>\n<p>Und sicher fallen Ihnen noch mehr Anwendungsf&auml;lle ein, an die wir noch nicht gedacht haben.<\/p>\n<h2>Erweiterungen der Klasse<\/h2>\n<p>Im Kopf des Klassenmoduls <b>clsEverything<\/b> sind zwar alle aktuellen Deklarationen zur Schnittstelle eingebaut, doch nicht alle werden von den Prozeduren auch verwendet. Sie nutzen nur jene, die f&uuml;r die grundlegende Ansprache von Everything ben&ouml;tigt werden.<\/p>\n<p>Im <b>SDK<\/b> von <b>Everything<\/b> (<b>http:\/\/www.voidtools.com\/support\/everything\/sdk\/<\/b>) finden Sie zu allen Funktionen die genaue Bedeutung der Parameter. So haben wir f&uuml;r die Einstellung des Suchausdrucks die Funktion <b>SetSearchW<\/b> verwendet. <b>Regul&auml;re Ausdr&uuml;cke<\/b> sind dabei nicht m&ouml;glich. Daf&uuml;r etwa m&uuml;ssten Sie zus&auml;tzlich die Funktion <b>SetRegEx<\/b> benutzen und ihr den Long-Wert <b>1<\/b> &uuml;bergeben.<\/p>\n<p>Sie k&ouml;nnen auch veranlassen, dass <b>Everything<\/b> geschlossen wird, etwa dann, wenn der Anwender Ihre Datenbank schlie&szlig;t. Dann verwenden Sie die Funktion <b>Everything_Exit<\/b>.<\/p>\n<p>Sollte <b>Everything<\/b> schon auf dem Rechner installiert sein und keinen ferngesteuerten Start ben&ouml;tigen, so m&ouml;chten Sie vielleicht wissen, ob die Anwendung unter Administrator- oder Benutzerrechten ausgef&uuml;hrt wird. Das erfahren Sie &uuml;ber einen Aufruf der Funktion <b>Everything_IsAdmin<\/b>, die <b>0<\/b> zur&uuml;ckgibt, wenn es im Benutzermodus l&auml;uft. Manche Dateien und Orte werden dann von <b>Everything<\/b> nicht erfasst.<\/p>\n<p>Nebenbei k&ouml;nnen Sie <b>Everything<\/b> auch zweckentfremden, etwa, um zu ermitteln, welches Betriebssystem installiert ist. Die Funktion <b>Everything_GetTargetMachine<\/b> gibt eine <b>1<\/b> aus, wenn es sich um ein <b>32-Bit-OS<\/b> handelt, und eine <b>2<\/b>, falls es ein <b>64-Bit-OS<\/b> ist.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>everything.accdb<\/p>\n<p>Everything.h<\/p>\n<p>Everything32.dll<\/p>\n<p>starteverything.vbs<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/0F46C500-C1B5-43D1-94C1-6E4EC0FB555F\/aiu_1142.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Verlieren Sie auch hin und wieder den &Uuml;berblick &uuml;ber Ihr Dateisystem und finden partout bestimmte Dateien nicht mehr auf Dann ist neben der Windows-Suche ein Tool wie Everything ein guter Freund. Doch nicht nur die Anwendung mit ihrer Oberfl&auml;che selbst ist ein ausgereifter Helfer. Denn als Pluspunkt k&ouml;nnen Sie zus&auml;tzlich eine API-Schnittstelle verbuchen, welche sich aus Access heraus ansprechen l&auml;sst.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662018,66042018,44000027],"tags":[],"class_list":["post-55001142","post","type-post","status-publish","format-standard","hentry","category-662018","category-66042018","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Dateien schnell suchen mit Everything - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dateien schnell suchen mit Everything\" \/>\n<meta property=\"og:description\" content=\"Verlieren Sie auch hin und wieder den &Uuml;berblick &uuml;ber Ihr Dateisystem und finden partout bestimmte Dateien nicht mehr auf Dann ist neben der Windows-Suche ein Tool wie Everything ein guter Freund. Doch nicht nur die Anwendung mit ihrer Oberfl&auml;che selbst ist ein ausgereifter Helfer. Denn als Pluspunkt k&ouml;nnen Sie zus&auml;tzlich eine API-Schnittstelle verbuchen, welche sich aus Access heraus ansprechen l&auml;sst.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:11:41+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/24b53cb6e46e459eb9cfb6c34d73aefb\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"29\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Dateien schnell suchen mit Everything\",\"datePublished\":\"2020-05-13T21:11:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/\"},\"wordCount\":5136,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/24b53cb6e46e459eb9cfb6c34d73aefb\",\"articleSection\":[\"2018\",\"4\\\/2018\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/\",\"name\":\"Dateien schnell suchen mit Everything - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/24b53cb6e46e459eb9cfb6c34d73aefb\",\"datePublished\":\"2020-05-13T21:11:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/24b53cb6e46e459eb9cfb6c34d73aefb\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/24b53cb6e46e459eb9cfb6c34d73aefb\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_suchen_mit_Everything\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dateien schnell suchen mit Everything\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dateien schnell suchen mit Everything - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/","og_locale":"de_DE","og_type":"article","og_title":"Dateien schnell suchen mit Everything","og_description":"Verlieren Sie auch hin und wieder den &Uuml;berblick &uuml;ber Ihr Dateisystem und finden partout bestimmte Dateien nicht mehr auf Dann ist neben der Windows-Suche ein Tool wie Everything ein guter Freund. Doch nicht nur die Anwendung mit ihrer Oberfl&auml;che selbst ist ein ausgereifter Helfer. Denn als Pluspunkt k&ouml;nnen Sie zus&auml;tzlich eine API-Schnittstelle verbuchen, welche sich aus Access heraus ansprechen l&auml;sst.","og_url":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:11:41+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/24b53cb6e46e459eb9cfb6c34d73aefb","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"29\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Dateien schnell suchen mit Everything","datePublished":"2020-05-13T21:11:41+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/"},"wordCount":5136,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/24b53cb6e46e459eb9cfb6c34d73aefb","articleSection":["2018","4\/2018","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/","url":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/","name":"Dateien schnell suchen mit Everything - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/24b53cb6e46e459eb9cfb6c34d73aefb","datePublished":"2020-05-13T21:11:41+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/24b53cb6e46e459eb9cfb6c34d73aefb","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/24b53cb6e46e459eb9cfb6c34d73aefb"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_suchen_mit_Everything\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Dateien schnell suchen mit Everything"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001142","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001142"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001142\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}