Hallo,
Ich habe ein mir unerklärliches Verhalten der Funktion
FindFirstFile in Visual C++ 6.
Das Problem tritt dann auf wenn ich es direkt auf ein Laufwerk anwende also genau gesagt mit manchen Laufwerken klappt es und mit anderen nicht, auf meinem Rechner befinden sich 3 Festplatten C:,D: und F:
WIN32_FIND_DATA ffdata;
HANDLE hFindFile;
hFindFile = FindFirstFile( "c:",&ffdata );
Der Aufruf funktioniert so wunderbar bei Laufwerk C: und auch auf meinem Laufwerk F: aber nicht auf D: und ich habe keine Ahnung wieso.
Natürlich habe ich es mit Backslash "d:\\\\" probiert aber dann klappt das bei keinem Laufwerk mehr. Achja es befinden sich sowohl Ordner aus auch Dateien auf den Laufwerken, ich habe natürlich versucht gleiche Testbedingungen herzustellen um den Fehler zu finden was mich aber nicht wesentlich weitergebracht hat. Hat hier vielleicht jemand eine Idee oder kennt das Problem ?
Gruss Fein
Paul
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Hi
Schon das probiert?
hFindFile = FindFirstFile( "D:\\*", &ffdata );
Haben alle Laufwerke das gleiche Dateisystem? Sind alles primäre Partitionen?
Gruss, d-oli
PS: Ich meine natürlich hFindFile = FindFirstFile( "D:\\\\*", &ffdata ); ... je nach Ansicht.
Wie wäre es mit
hFindFile = FindFirstFile( "D:\*.*", &ffdata );
mr.escape
HANDLE FindFirstFile(
LPCTSTR lpFileName, // file name
LPWIN32_FIND_DATA lpFindFileData // data buffer
);
lpFileName
[in] Pointer to a null-terminated string that specifies a valid directory or path and file name, which can contain wildcard characters (* and ?). If the string ends with a wildcard, a period, or a directory name, the user must have access to the root and all subdirectories on the path.
Würde da nicht ".", ".." und alle Dateien ohne Endung übersehen?
d-oli
Wieso sollten sie? Auch diese namen passen zu den wildcards und ich weiß aus eigener erfahrung, dass es so läuft. Man muss vielmehr noch per "ffdata.dwFileAttributes" die überflüssigen entfernen.
Per rootkit versteckte elemente werden damit aber nicht gefunden.
mr.escape
Also D: ist eine SCSI-Platte, das ist aber auch schon der einzige Unterschied.
Alle 3 sind logische Partitionen FAT32.
Wenn du bei der suche nur den laufwerksbuchstaben angibst, ohne eine pfadangabe, wird der aktuelle pfad des gewählten laufwerks verwendet und der kann auch etwas anderes als "'" sein.
mr.escape
Es funktioniert ja wenn ich "d:\\unterordner" angebe aber nicht wenn ich "d:" angebe.
Das habe ich nicht ganz verstanden glaube ich,
ich kriege kein Handle zurück also nichts.
Ich habs bei einem Freund probiert da geht D: auch nicht.
D: ist bei ihm eine erweiterte Partition.
Ich werde jetzt mal mein D: Laufwerk in Z: umbenennen. Ich bin gespannt was passiert...
Ich werde berichten.
Wenn du aber "d:\unterordner" angibst und in "D:\" tatsächlich ein ordner namens "unterordner" existiert, dann wird eben nur dieser gefunden. Eher wundert es mich, dass "C:" etwas liefert.
mr.escape
Noch was dazu:
The FindFirstFile function opens a search handle and returns information about the first file whose name matches the specified pattern. After the search handle has been established, use the FindNextFile function to search for other files that match the same pattern. When the search handle is no longer needed, close it by using the FindClose function.
In rare cases, file attribute information on NTFS file systems may not be current at the time you call this function. To obtain the current NTFS file attributes, call GetFileInformationByHandle.
This function searches for files by name only; it cannot be used for attribute-based searches.
You cannot use root directories as the lpFileName input string for FindFirstFile, with or without a trailing backslash. To examine files in a root directory, use something like "C:\*" and step through the directory with FindNextFile. To get the attributes of a root directory, use GetFileAttributes. Prepending the string "\\?\" does not allow access to the root directory.
Similarly, on network shares, you can use an lpFileName of the form "\\server\service\*" but you cannot use an lpFileName that points to the share itself, such as "\\server\service".
To examine any directory other than a root directory, use an appropriate path to that directory, with no trailing backslash. For example, an argument of "C:\windows" will return information about the directory "C:\windows", not about any directory or file in "C:\windows". An attempt to open a search with a trailing backslash will always fail.
mr.escape
Hallo Mr.Escape
Ja das leuchtet ein, "D:\\*" werde ich mal probieren.
DANKE !!!