====== Zugriff auf das FileSystem ====== GNU C Library: **[[http://www.gnu.org/software/libc/manual/html_node/File-System-Interface.html#File-System-Interface|File System Interface]]** :!: Als Vorlage habe ich folgende Seite verwendet:\\ [[http://www.imb-jena.de/~gmueller/kurse/c_c++/c_file.html]] Weitere Quellen: * Mit Verzeichnissen arbeiten: [[http://openbook.rheinwerk-verlag.de/linux_unix_programmierung/Kap02-004.htm]] (mkdir(), chdir(), fchdir(), rmdir(), struct dirent, opendir(), closedir(), scandir(), ftw(), etc.) * POSIX Reference, "dirent.h": [[https://en.wikibooks.org/wiki/C_Programming/POSIX_Reference/dirent.h]] FIXME ===== stat() ===== **stat()** - Liefert Informationen über das File **path** und legt diese in der Struktur **info** ab.\\ :!: Das File muß __nicht geöffnet__ sein. Deklaration: #include #include // 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 #include #include #include 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 #include #include #include #include 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() ===== **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 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 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 ===== remove() ===== FIXME ===== chmod() ===== FIXME ===== access() ===== **access()** - Stellt fest, ob ein Prozess bestimmte Berechtigungen für den Zugriff auf eine Datei hat. #include // für Unix/Linux #include // 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: * 0 = OK * -1 = Fehler Quelle: [[http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/017_c_dateien_verzeichnisse_002.htm]] ===== utime() ===== utime(), utimes() - Change file last access and modification times. Quelle: [[http://man7.org/linux/man-pages/man2/utime.2.html]] ===== getcwd() ===== FIXME ===== mkdir() ===== FIXME ===== rmdir() ===== FIXME ===== chdir() ===== FIXME ===== realpath() ===== **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 #include char *realpath(const char *path, char *resolved_path); Quelle: [[http://man7.org/linux/man-pages/man3/realpath.3.html]] ===== dirname() und basename() ===== Das sind Funktionen um Pfade zu parsen. #include 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" | |"/" |"/" |"/" | |"." |"." |"." | |".." |"." |".." | ===== opendir() ===== FIXME [[EDV:OS:UNIX:Derivate:AIX]]: [[https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.basetrf1/opendir.htm?lang=de]] (zur Struktur **[[https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.files/dir.htm?lang=de|"struct direct"]]**)\\ oder [[https://www.ibm.com/support/knowledgecenter/ssw_aix_72/com.ibm.aix.basetrf1/opendir.htm]] ===== readdir() und readdir_r() ===== FIXME Linux: [[http://man7.org/linux/man-pages/man3/readdir.3.html]]\\ [[EDV:OS:UNIX:Derivate: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]]\\ [[EDV:OS:UNIX:Derivate: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]] * Hinweis in Zusammenhan mit %%struct dirent%% und %%NAME_MAX%%: [[http://www.gnu.org/software/libc/manual/html_node/Reading_002fClosing-Directory.html#Reading_002fClosing-Directory]] (s. %%union%%) 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]] ===== fnmatch() ===== Falls die File-/Ordner-Namen nach //pattern// gesucht werden, läßt sich mit der fnmatch() feststellen, ob der gefundene Eintrag dem vorgegebenen Muster entspricht. FIXME [[http://man7.org/linux/man-pages/man3/fnmatch.3.html]] ===== closedir() ===== FIXME ---- Stand: 23.05.2016\\ --- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]// EOF