Cross-Plattform-Art und Weise, ob eine Datei zu testen ist ein Verzeichnis
-
25-09-2019 - |
Frage
Zur Zeit habe ich einige Codes wie (kondensierte und eine Reihe von Fehlerprüfung entfernt):
dp = readdir(dir);
if (dp->d_type == DT_DIR) {
}
Das funktioniert swimmingly auf meinem Linux-Rechner. Allerdings auf einer anderen Maschine (sieht aus wie SunOS, Sparc):
SunOS HOST 5.10 Generic_127127-11 sun4u sparc SUNW,Ultra-5_10
ich folgende Fehlermeldung bei der Kompilierung erhalten:
error: structure has no member named `d_type'
error: `DT_DIR' undeclared (first use in this function)
Ich dachte, die dirent.h
-Header krossplattformischen war (für POSIX-Maschinen). Irgendwelche Vorschläge.
Lösung
http://www.nexenta.org/os/Porting_Codefixes :
Die Struktur dirent Definition in solaris enthält nicht das
d_type
Feld. Sie müssten die Änderungen vornehmen wie folgt
if (de->d_type == DT_DIR)
{
return 0;
}
Änderungen an
struct stat s; /*include sys/stat.h if necessary */
..
..
stat(de->d_name, &s);
if (s.st_mode & S_IFDIR)
{
return 0;
}
Da stat
ist auch POSIX-Standard sollte es mehr Cross-Plattform sein. Sie können aber wollen if ((s.st_mode & S_IFMT) == S_IFDIR)
verwenden, um den Standard zu folgen.