Inhaltsverzeichnis

Zugriff auf das FileSystem

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:

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 <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()

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

remove()

FIXME

chmod()

FIXME

access()

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()

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 <limits.h>
#include <stdlib.h>
 
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 <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"
"/" "/" "/"
"." "." "."
".." "." ".."

opendir()

FIXME

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

readdir() und readdir_r()

FIXME

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

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
: Jürgen Kreick

EOF