====== 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