Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Findfirst findet Ordner wie System Volume Information nicht? (https://www.delphipraxis.net/111371-findfirst-findet-ordner-wie-system-volume-information-nicht.html)

Luckie 2. Apr 2008 14:05

Re: Findfirst findet Ordner wie System Volume Information ni
 
Zitat:

Zitat von richard_boderich
Kann deine ADS Klasse vielleicht sowas?

Was hat meine ADS-Klasse zum Auslesen und Bearbeiten von alternativen Datenströmen bei NTFS Dateisystemen mit dem Setzen von Zugriffsberechtigungen von Ordnern und Dateien zu tun?

wido 2. Apr 2008 14:34

Re: Findfirst findet Ordner wie System Volume Information ni
 
Zitat:

Zitat von richard_boderich
@taaktaak
Bist du dir da sicher? Diese Kombination habe ich auch schon ausprobiert?! Außerdem solltest du die Attribute niemals Addieren, sondern Logisch verknüpfen wurde hier mal gesagt.

Bei Win32 API werden die Parameter logisch verknüpft. Bei den meisten Delphi Funktionen (wie z.B. FindFirst) wird addiert.

Muetze1 2. Apr 2008 15:32

Re: Findfirst findet Ordner wie System Volume Information ni
 
Zitat:

Zitat von wido
Zitat:

Zitat von richard_boderich
@taaktaak
Bist du dir da sicher? Diese Kombination habe ich auch schon ausprobiert?! Außerdem solltest du die Attribute niemals Addieren, sondern Logisch verknüpfen wurde hier mal gesagt.

Bei Win32 API werden die Parameter logisch verknüpft. Bei den meisten Delphi Funktionen (wie z.B. FindFirst) wird addiert.

Was aber definitiv falsch ist, da sich die Konstanten aus den WinAPI Konstanten zusammen setzen und es so oder so eine Bittabelle ist und somit logisch verknüpft werden müssen.

Addier doch einfach mal ein Wert zweifach oder faAnyFile dazu, dann haste deine Begründung warum das falsch ist und man definitiv OR verwenden sollte.

Was mich mal interessiert: Wodrauf beruht deine Aussage das die Addition richtig ist? Die Hilfe hat genügend Fehler und ist keine sichere Basis.

wido 2. Apr 2008 16:29

Re: Findfirst findet Ordner wie System Volume Information ni
 
Zitat:

Addier doch einfach mal ein Wert zweifach oder faAnyFile dazu, dann haste deine Begründung warum das falsch ist und man definitiv OR verwenden sollte.
Wieso sollte ich bei der Verwendung von faAnyFile überhaupt irgend eine andere Konstante addieren oder aber bitweise verknüpfen? Und natürlich, wenn ich Konstanten doppelt und dreifach addiere, dann funktioniert es nicht. Ändert nichts daran, daß eigentlich der komplette Code von CodeGear die Konstanten addiert und auch in der Hilfe dies der einzig dokumentierte Weg ist.

Mal davon abgesehen, daß z.B. ein faSysFile or faHidden or faDirectory das Selbe ist wie ein faSysFile + faHidden + faDirectory.

shmia 2. Apr 2008 17:07

Re: Findfirst findet Ordner wie System Volume Information ni
 
Zitat:

Zitat von wido
[Wieso sollte ich bei der Verwendung von faAnyFile überhaupt irgend eine andere Konstante addieren oder aber bitweise verknüpfen? Und natürlich, wenn ich Konstanten doppelt und dreifach addiere, dann funktioniert es nicht. .

Es ist nun mal so, dass die File Attribute bitcodiert sind!
siehe: http://msdn2.microsoft.com/en-us/library/aa365740(VS.85).aspx (Hinweis: link kopieren, direkt anklicken geht nicht)

Bit 0 - read only
Bit 1 - Hidden
....

Wenn man bestimmte Bits aktivieren möchte muss man OR benützen.
Wenn man bestimmte Bits ausblenden möchte muss man AND NO benützen.
Das sind Grundlagen der Informatik.

Wenn man z.B. alle Dateien ohne Verzeichnisse finden möchte dann schreibt man:
faAnyFile AND NOT faDirectory
Zitat:

Zitat von wido
Ändert nichts daran, daß eigentlich der komplette Code von CodeGear die Konstanten addiert und auch in der Hilfe dies der einzig dokumentierte Weg ist.
Mal davon abgesehen, daß z.B. ein faSysFile or faHidden or faDirectory das Selbe ist wie ein faSysFile + faHidden + faDirectory.

Das ist nur ein Scheinargument. Wenn falsche Dinge im Internet verbreitet werden, bedeutet das nicht, dass sie damit richtig werden.

Muetze1 2. Apr 2008 17:24

Re: Findfirst findet Ordner wie System Volume Information ni
 
Zitat:

Zitat von wido
Wieso sollte ich bei der Verwendung von faAnyFile überhaupt irgend eine andere Konstante addieren oder aber bitweise verknüpfen?

Es war ein offensichtliches Beispiel. Schon allein wenn du das als Vorbelegung einer Variablen nimmst welche später dem FindFirst übergeben wird und dazwischen diese Variable noch angepasst wird, kann dies passieren.

Zitat:

Zitat von wido
Und natürlich, wenn ich Konstanten doppelt und dreifach addiere, dann funktioniert es nicht.

Und wenn du das schreibst, ist es dir doch ganz genau bewusst das es Bitkonstanten sind und man diese somit nicht addiert, gerade weil ein falsches Ergebnis rauskommt.

Zitat:

Zitat von wido
Ändert nichts daran, daß eigentlich der komplette Code von CodeGear die Konstanten addiert und auch in der Hilfe dies der einzig dokumentierte Weg ist.

Wobei sich CodeGear nicht rausnimmt unfehlbar zu sein und es gibt genug Falschaussagen in der VCL/Delphi Hilfe. Ich erinnere da nur an das case-insensitive IndexOf() bei TStrings.

Zitat:

Zitat von wido
Mal davon abgesehen, daß z.B. ein faSysFile or faHidden or faDirectory das Selbe ist wie ein faSysFile + faHidden + faDirectory.

not not true ist auch wieder true, trotzdem schreibt man's nicht.

taaktaak 2. Apr 2008 18:11

Re: Findfirst findet Ordner wie System Volume Information ni
 
Es ist schon erstaunlich. Da macht man jahrelang etwas nicht richtig. Es führt nie zu einem Fehler oder unkorrekten Ergebnis. Trotzdem ist es, nüchtern betrachtet, falsch. Die Diskussion hat mich überzeugt. Künftig wird's nur noch mit OR Verknüpft!

Bemerkenswert dabei, das man auch im Falle solcher (scheinbaren) Nebensächlichkeiten häufig noch etwas dazu lernen kann!
Vielen Dank allen Beteiligten!

wido 2. Apr 2008 18:17

Re: Findfirst findet Ordner wie System Volume Information ni
 
Schauts, wir brauchen darüber eigentlich nicht zu diskutieren.

CodeGear möchte, daß man die Werte addiert. Es ist so von ihnen dokumentiert und sie selbst handhaben es innerhalb des VCL Codes ebenfalls so. Das man es bitcodieren kann, hab ich nie bestritten. Wie gesagt, sollte das Bit bzw. die Bits nicht gesetzt sein, erhält man bei der Addition mit der Konstante den selben Wert wie bei nem OR. Allerdings bevorzuge ich im Zweifelsfall dann doch eher die dokumentierte Methode alleine schon deshalb um eine gewisse Zukunftssicherheit für meinen Code zu gewährleisten.

Muetze1 2. Apr 2008 19:00

Re: Findfirst findet Ordner wie System Volume Information ni
 
Zitat:

Zitat von wido
Allerdings bevorzuge ich im Zweifelsfall dann doch eher die dokumentierte Methode alleine schon deshalb um eine gewisse Zukunftssicherheit für meinen Code zu gewährleisten.

Rofl - ehrlich - schon allein dadurch baust du dir selber eine Unsicherheit für die Zukunft. Schon allein da CodeGear diesen Fehler mit spätestens D7 in der Hilfe umformuliert hat und die Abfrage von Attributen mit dem AND Operator erklärt.

Zitat:

Um ein Attribut zu testen, führen Sie eine AND-Verknüpfung des Attr-Feldes mit der Attributkonstante durch. Besitzt die Datei das betreffende Attribut, ist der zurückgegebene Wert größer als 0. Wurde beispielsweise eine verborgene Datei gesucht, ergibt der folgende Ausdruck true:

Delphi: (SearchRec.Attr and faHidden) <> 0.
C++: (SearchRec.Attr & faHidden) != 0.
Mir kommt es eher so vor, als wenn CodeGear für dich unfehlbar ist und du blind folgst. So lange man dir nicht sagt "stehen bleiben", gehst du weiter auf die Klippe zu, wider besserem Wissens.

Zitat:

Zitat von wido
CodeGear möchte, daß man die Werte addiert. Es ist so von ihnen dokumentiert und sie selbst handhaben es innerhalb des VCL Codes ebenfalls so.

Das Beispiel wurde spätestens mit Delphi 7 aus der Hilfe entfernt. Ansonsten sehe ich keine Stelle wo CodeGear das selbst so macht. Und in den VCL Codes nutzen sie immer "or", "and not" bzw. "and" im Zusammenhang mit diesen Attributflags. Nirgendwo, wirklich nirgendwo, habe ich diese Addition in den VCL Quellen im Zusammenhang mit diesen Attributflags gefunden.

FileIsReadOnly, FileSetReadOnly, etc machen dies so.

Das beste Beispiel ist sogar die erste Zeile der FindFirst Implementation von Codegear:
Delphi-Quellcode:
  faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;
(Copyright (c) 1995-2002 Borland Softwrare Corporation) Der Schreibfehler ist Original!

Ich kann diese sture Haltung bezüglich überzeugender Argumente wirklich nicht verstehen - und ich finde über sowas muss man diskutieren. Schon grundlegend weil wir hier Informationen anbieten und damit verbreiten von denen viele andere lernen - oftmals still und leise durch die SuFu, google, etc. Von daher kann ich es nicht mit mir vereinbaren etwas gut zu heissen was definitiv und "bewiesener Maßen" falsch ist. Als das größte deutschsprachige Delphi-Forum und zusätzlich zu Delphi als Lehrsprache in den Schulen haben wir eine gewisse Verantwortung und somit muss man darüber diskutieren.

wido 2. Apr 2008 19:23

Re: Findfirst findet Ordner wie System Volume Information ni
 
Ok, da das Signal, das ich mit dem letzten Posting setzen wollte, offensichtlich nicht deutlich genug war:

E.O.D.

Du kannst Deine Zeit aber gerne noch weiter damit vertreiben mich davon zu überzeugen, daß ich Unrecht habe und Du nicht. Mein Standpunkt, daß ich bei 2 möglichen Methoden stets die nutze, die dokumentiert ist, wird sich dadurch nicht ändern:

Zitat:

Attributes can be combined by adding (Delphi) or or-ing (C++) their constants or values. For example, to search for read-only and hidden files in addition to normal files, pass (faReadOnly + faHidden) in Delphi or (faReadOnly | faHidden) in C++ as the Attr parameter. To include only normal files, pass zero for the Attr parameter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz