GNU C Library: File System Interface
Als Vorlage habe ich folgende Seite verwendet:
http://www.imb-jena.de/~gmueller/kurse/c_c++/c_file.html
Weitere Quellen:
stat() - Liefert Informationen über das File path und legt diese in der Struktur info ab.
Das File muß nicht geöffnet sein.
Deklaration:
#include <sys/types.h> #include <sys/stat.h> // ACHTUNG: nicht in ANSI C int stat(const char *path, struct stat *info);
Die Struktur stat ist i.d.R. wie folgt aufgebaut:
struct stat { time_t st_atime; // Datum des letzten Zugriffs (atime) time_t st_ctime; // Datum der letzten Statusänderung (ctime) dev_t st_dev; // Gerätenummer gid_t st_gid; // Gruppennummer (GID) ino_t st_ino; // i-node Nummer mode_t st_mode; // Fileattribute time_t st_mtime; // Datum der letzten Modifikation (mtime) nlink_t st_nlink; // Anzahl der Verweise (links) off_t st_size; // Filegröße in Byte off_t st_blksize; // Blockgröße in Byte uid_t st_uid; // Eigentümernummer (UID) dev_t st_rdev; // Geräteidentifikationsnummer }; // struct stat
Beispiel:
#include <stdio.h> #include <time.h> #include <sys/types.h> #include <sys/stat.h> int main (int argc, char *argv[]) { struct stat s; stat(argv[0], &s); printf("%-40s : %s\n", "File", argv[0]); printf("%-40s : %d\n", "size", s.st_size); printf("%-40s : %ud\n", "Attribute", s.st_mode); printf("%-40s : %d\n", "UID", s.st_uid); printf("%-40s : %d\n", "GID", s.st_gid); printf("%-40s : %s\n", "mtime", ctime(&s.st_mtime)); printf("%-40s : %s\n", "ctime", ctime(&s.st_ctime)); printf("%-40s : %s\n", "atime", ctime(&s.st_atime)); return 0; } // main()
Es empfielt sich, bei der Auswertung der Status-Struktur das Flag S_IFMT zu berücksichtigen:
#include <sys/types.h> #include <sys/stat.h> #include <time.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { struct stat sb; if (stat(argv[1], &sb) == -1) { perror("stat"); exit(EXIT_FAILURE); } printf("File type: "); switch (sb.st_mode & S_IFMT) { case S_IFBLK: printf("block device\n"); break; case S_IFCHR: printf("character device\n"); break; case S_IFDIR: printf("directory\n"); break; case S_IFIFO: printf("FIFO/pipe\n"); break; case S_IFLNK: printf("symlink\n"); break; case S_IFREG: printf("regular file\n"); break; case S_IFSOCK: printf("socket\n"); break; default: printf("unknown?\n"); break; } exit(EXIT_SUCCESS); }
Infos unter http://man7.org/linux/man-pages/man2/stat.2.html oder http://linux.die.net/man/2/fstat
In den Libraries aus MS Visual Studio heißt diese Funktion anders - etwa "_stat()", "_stat32()", "_stat64()" u.s.w.
Weitere Infos unter http://msdn.microsoft.com/en-us/library/14h5k7ff(v=vs.100).aspx
rename() - Ändert den Namen der Datei von oldname in newname. Beide Namen können vollständige Pfade beinhalten.
Ist eine der Dateien zum Zeitpunkt des Aufrufs von rename() durch einen Prozeß geöffnet, so gibt rename() den Fehler EACESS zurück.
Deklaration:
#include <stdio.h> int rename(const char *oldname, const char *newname);
Rückgabewert:
0 - OK -1 - Fehler
Bei Fehlern wird in errno ein der folgenden Werte gespeichert:
EACCES - Zugriff nicht gestattet ENOENT - Pfad/Datei nicht gefunden ENOTSAM - Ziel- und Quell-Laufwerk sind nicht identisch
Beispiel:
#include <stdio.h> int main (void) { char oldname[80], newname[80]; stat(argv[0], &s); printf("Umzubenennende Datei: "); gets(oldname); printf("Neuer Name : "); gets(newname); if (rename(oldname, newname) == 0) printf("Datei [%s] wurde in [%s] umbenannt\n", oldname, newname); else perror("rename"); return 0; } // main()
Wirkung von perror() z.B.:
rename: No such file or directory
access() - Stellt fest, ob ein Prozess bestimmte Berechtigungen für den Zugriff auf eine Datei hat.
#include <unistd.h> // für Unix/Linux #include <io.h> // für MS-DOS int access(const char *pfad, int modus);
Der Parameter modus kann dabei folgende Werte haben:
Makro | Wert | Bedeutung |
---|---|---|
F_OK | 00 | Die Datei existiert. |
X_OK | 01 | Die Datei ist ausführbar (nur Linux/Unix). |
W_OK | 02 | Die Datei ist beschreibbar. |
R_OK | 04 | Die Datei ist lesbar. |
Rückgabewert:
Quelle: http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/017_c_dateien_verzeichnisse_002.htm
utime(), utimes() - Change file last access and modification times.
realpath() - Extrahiert alle symbolische Links und löst Referenzen zu /./, /../ und extra '/'-Symbole auf in einen Null-terminierten String (wandelt in die Form "canonicalized absolute pathname").
#include <limits.h> #include <stdlib.h> char *realpath(const char *path, char *resolved_path);
Quelle: http://man7.org/linux/man-pages/man3/realpath.3.html
Das sind Funktionen um Pfade zu parsen.
#include <libgen.h> char *dirname(char *path); char *basename(char *path);
Die Funktionen dirname() and basename() zerlegen den Null-terminierten String in Directory und Filename.
Zusammensetzung des Ergebnisses von dirname(), "/" und des Ergebnisses von basename() ergibt den kompletten String für Directory/Filename.
Folgendes Beispiel zeigt es anschaulich:
path | dirname() | basename() |
---|---|---|
"/usr/lib" | "/usr" | "lib" |
"/usr/" | "/" | "usr" |
"usr" | "." | "usr" |
"/" | "/" | "/" |
"." | "." | "." |
".." | "." | ".." |
AIX: https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.basetrf1/opendir.htm?lang=de (zur Struktur "struct direct")
oder https://www.ibm.com/support/knowledgecenter/ssw_aix_72/com.ibm.aix.basetrf1/opendir.htm
Linux: http://man7.org/linux/man-pages/man3/readdir.3.html
AIX: https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.basetrf2/readdir_r.htm?lang=de
oder https://www.ibm.com/support/knowledgecenter/ssw_aix_72/com.ibm.aix.basetrf2/readdir_r.htm?lang=de
Solaris: http://www.manpages.info/sunos/readdir.3.html
oder https://docs.oracle.com/cd/E19455-01/806-0627/6j9vhfn49/index.html
struct dirent: http://www.gnu.org/software/libc/manual/html_node/Directory-Entries.html
Windows stellt andere Funktionen zur Verfügung, die dem gleichen Zweck dienen: FindFirstFile(), FindNextFile() und FindClose():
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418%28v=vs.85%29.aspx
Falls die File-/Ordner-Namen nach pattern gesucht werden, läßt sich mit der fnmatch() feststellen, ob der gefundene Eintrag dem vorgegebenen Muster entspricht.