Προς το περιεχόμενο

Μια τελευταία βοήθεια....


georginos1989

Προτεινόμενες αναρτήσεις

Δημοσ.

Θα χρειαστώ μια τελευταία βοήθεια με το προγραμμά μου..

Directx με έχεις βοηθήσει πολύ αλλά θέλω ακόμα μια χάρη

Να εξηγήσεις περιληπτικά τι κάνει κάθε σειρά του προγράμματος που είχες ετοιμάσει. Βασικά θέλω να εξηγήσεις τις 2 συναρτήσεις τι κανουν... Έχεις βάλει σχόλια αλλά αν μπορείς βάλε σε όλες τις γραμμές...

 

Ευχαριστώ...

 

#include <stdio.h>

#include <dirent.h>

#include <dos.h>

#include <io.h>

#include <direct.h>

#include <string.h>

 

void show_directory (char *directory_name, int *pnRight);

void printright(int *nIdent);

 

int main(int argc, char *argv[])

{

int nRight = 0;

/* Αν δεν υπάρχει Option ψάξε το παρόν (.) directory */

show_directory((argc == 1) ? ".": argv[1], &nRight);

 

return 0;

}

 

void show_directory (char *directory_name, int *pnRight)

{

DIR *directory_pointer;

struct dirent *entry;

unsigned attributes;

 

if ((directory_pointer = opendir(directory_name)) == NULL)

printf("error opening %s\n", directory_name);

else

{

chdir(directory_name);

while ((entry = readdir(directory_pointer)) != NULL)

{

attributes = _chmod(entry->d_name,0);

 

/* Αφαίρεση του strncmp . με το πιο συνεπές για Windows strcmp . & .. */

if ((attributes & FA_DIREC) && strcmp(entry->d_name, ".") && strcmp(entry->d_name, ".."))

{

/* Εκτυπώνουμε pnRight κενούς χαρακτήρες στο stdout */

printright(pnRight);

/* Εκτυπώνουμε το όνομα του κατάλογου */

printf("[%s]\n", entry->d_name);

 

/* Αυξάνουμε το βάθος +1 χαρακτήρα δεξιά για τα υπόλοιπα στοιχεία */

*pnRight = *pnRight + 1;

 

show_directory(entry->d_name, pnRight);

}

else

{

/* Εκτυπώνουμε pnRight κενούς χαρακτήρες στο stdout */

printright(pnRight);

/* Εκτυπώνουμε το όνομα του αρχείου */

printf("%s\n", entry->d_name);

}

}

closedir(directory_pointer);

chdir("..");

 

/*

* Γυρίσαμε πίσω κατά έναν κατάλογο (επιτυχώς ή όχι) -

* αφαιρούμε 1 χαρακτήρα από το βάθος όσο pnRigt > 0.

*/

if(*pnRight > 0)

*(int*)pnRight = *(int*)pnRight - 1;

}

}

 

void printright(int *nRight)

{

/*

* Προσθέτει nRight κενά στο szIdent char array και ύστερα το εκτυπώνει

* στο stdout δίχως αλλαγή γραμμής. Το szIdent έχει μέγεθος BUFSIZ που

* συνήθως είναι αρκετό για μια τυπική directory->subdirectory->subdir..

* δομή λογικού βάθους

*/

static char szIdent[bUFSIZ];

 

/* Μηδενίζουμε το szIdent */

memset(&szIdent, 0, sizeof(szIdent));

/* Αυξάνουμε το szIdent άμεσα κατά nRight ' ' */

memset(&szIdent, ' ', (*nRight) * sizeof(char));

/* Εκτύπωση */

printf("%s", szIdent);

}

Δημοσ.

Το πρόγραμμα αυτό δεν το έχω κατασκευάσει εξολοκλήρου εγώ (όπως γνωρίζεις). Αντίθετα πρόσθεσα ορισμένες μετατροπές ώστε να εκτυπώνει με ιεραρχική δομή τα αποτελέσματα του (συν κάποια, ελάχιστα bugs-fixes – δίχως να σημαίνει ότι δεν έχει άλλα bugs ή αβλεψίες |για παράδειγμα δεν ελέγχει πάντα για επιτυχία κτλ.).

 

Με αυτή την διευκρίνιση ακολουθεί μια περιεκτική περιγραφή του προγράμματος.

 

>
/* Βιβλιοθήκες */
#include <stdio.h>	/* Βασική βιβλιοθήκη εισόδου - εξόδου */
#include <dirent.h>	/* Βιβλιοθήκη ρουτινών POSIX για την διαχείριση του συστήματος αρχείων από την C */
#include <dir.h>	/* Βιβλιοθήκη ρουτινών POSIX για την διαχείριση του συστήματος αρχείων από την C */
#include <dos.h>	/* Βιβλιοθήκη ρουτινών DOS όπου το POSIX δεν μας καλύπτει (το πρόγραμμα μας τρέχει σε MS-DOS & MS-Windows) */
#include <io.h>		/* "" "" */
#include <string.h> /* Βιβλιοθήκη ρουτινών διαχείρισης C strings */

/* Πρότυπα */
void show_directory (char *directory_name, int *pnRight);
void printright(int *nRight);

/* Είσοδος στο πρόγραμμα */
int main(int argc, char *argv[])
{
   /* Μηδενισμός του βάθους των φακέλων */
int	nRight = 0;

/*
 * Αν δεν υπάρχει παράμετρος από τον χρήστη ψάξε το παρόν (.) κατάλογο
 * διαφορετικά χρησιμοποίησε την πρώτη παράμετρο του προγράμματος ως
 * κατάλογο.
 */
show_directory((argc == 1) ? ".": argv[1], &nRight);

/*
 * Επιστροφή τιμής εκτέλεσης του προγράμματος στην γονική διεργασία που
 * το εκκίνησε ή στο Λ.Σ.
 */
return	0;
}

void show_directory (char *directory_name, int *pnRight)
{
/*
 * Η ρουτίνα αυτή επιστρέφει τα περιεχόμενα του κατάλογου directory_name.
 * Σε περίπτωση που τα περιεχόμενα περιλαμβάνουν καταλόγους η ρουτίνα
 * επιστρέφει τα περιεχόμενα τους εκτελώντας  εκ νέου τον εαυτό της (recursion).
 *
 * Το pnRight υποδεικνύει στην ρουτίνα πόσοι κενοί χαρακτήρες πρέπει να εισαχθούν
 * πριν εμφανισθούν τα περιεχόμενα του τρέχοντος directory_name.
 *
 * Κάθε φορά που η ρουτίνα βρίσκει ένα (υπό)κατάλογο αυξάνει(+1) το pnRight, κάθε
 * φορά που η ρουτίνα επιστρέφει σε γονικό κατάλογο ελαττώνει (-1) το pnRight.
 *
 * Με αυτό τον τρόπο η ρουτίνα αναπαριστά στην έξοδο (stdout) την (δενδροειδή)
 * δομή φακέλων / υποφακέλων και αρχείων.
 */

DIR *directory_pointer; /* Δείκτης αποτελέσματος της POSIX ρουτίνας opendir */
struct dirent *entry;	/* Δομή αποθήκευσης αποτελέσματος της POSIX ρουτίνας readdir */
unsigned attributes;	/* Μεταβλητή αποθήκευσης για την DOS ρουτίνα _chmod */

   /* Άνοιγμα του κατάλογου directory_name */
if ((directory_pointer = opendir(directory_name)) == NULL)
	printf("error opening %s\n", directory_name); /* Το άνοιγμα απέτυχε */
else
 {
       /* Μετάβαση στον κατάλογο directory_name */
	chdir(directory_name);
	/* Ανάγνωση όλων των περιεχομένων του κατάλογου directory_pointer */
	while ((entry = readdir(directory_pointer)) != NULL)
	 {
		/*
		 * Με παράμετρο μηδέν (0) ζητάμε από την DOS _chmod να επιστρέψει
		 * στην μεταβλητή attributes το τι είναι (αρχείο ή κατάλογος) το στοιχείο
		 * που μας επέστρεψε η readdir.
		 *
		 * Προσοχή: Η _chmod δεν είναι η POSIX chmod καθώς η τελευταία ΔΕΝ
		 * υποστηρίζει την επιστροφή του τύπου του στοιχείου που εξετάζουμε!
		 */
		attributes = _chmod(entry->d_name,0);

		/*
		 * Αν το στοιχείο κατά την _chmod (attributes) είναι κατάλογος (FA_DIREC)
		 * και αφού δεν πρόκειται για τους ειδικούς (εικονικούς) καταλόγους "." & ".."
		 * τότε ...
		 */
		if ((attributes & FA_DIREC) && strcmp(entry->d_name, ".") && strcmp(entry->d_name, ".."))
		 {
			/* ... Εκτυπώνουμε pnRight κενούς χαρακτήρες στο stdout .. */
			printright(pnRight);
			/* .. Εκτυπώνουμε το όνομα του κατάλογου .. */
			printf("[%s]\n", entry->d_name);

			/* .. Αυξάνουμε τους κενούς χαρακτήρες (+1) προς τα δεξιά για τα υπόλοιπα στοιχεία .. */
			*pnRight = *pnRight + 1;

			/* .. Εξετάζουμε εκ νέου τον φάκελο καλώντας τον εαυτό μας */
			show_directory(entry->d_name, pnRight);
		 }
		else
		 {
			/*
			 * ... Διαφορετικά αν πρόκειται για αρχείο ή τα "." & ".." τότε
			 * εκτυπώνουμε pnRight κενούς χαρακτήρες στο stdout
			 */
			printright(pnRight);
			/* και ύστερα εκτυπώνουμε το όνομα του αρχείου */
			printf("%s\n", entry->d_name);
		 }
	 }
	/* Απελευθερώνουμε  τον δείκτη opendir */
	closedir(directory_pointer);
	/* Επιστρέφουμε σε τυχόν προγενέστερο γονικό κατάλογό */
	chdir("..");

	/*
	 * Αφού γυρίσαμε πίσω κατά έναν κατάλογο (επιτυχώς ή όχι) -
	 * αφαιρούμε 1 χαρακτήρα από το βάθος όσο pnRigt > 0.
	 */
	if(*pnRight > 0)
		*(int*)pnRight = *(int*)pnRight - 1;
}
}

void printright(int *nRight)
{
/*
 * Προσθέτει nRight κενά στο szRight char array και ύστερα το εκτυπώνει
 * στο stdout δίχως αλλαγή γραμμής. Το szRight έχει μέγεθος BUFSIZ που
 * συνήθως είναι αρκετό για μια τυπική directory->subdirectory->subdir..
 * δομή λογικού βάθους
 */
static char szRight[bUFSIZ]; /* Συνήθος είναι 512 (είναι αρκετό για μια τυπική ιεραρχία Φακέλου->Υποφακέλου κτλ) */

/* Μηδενίζουμε το szRight */
memset(&szRight, 0, sizeof(szRight));
/* Αυξάνουμε το szRight άμεσα κατά nRight ' ' */
memset(&szRight, ' ', (*nRight) * sizeof(char));
/* Εκτύπωση */
printf("%s", szRight);
}

 

Καλή τύχη!

 

Υ.Γ.

Χρησιμοποίησα το δικό μου source από την τελευταία έκδοση που είχα δημοσιεύσει σε προγενέστερο θέμα.

Δημοσ.

Τι σημαίνει μηδενισμός του βάθους των φακέλων;

Τι σημαίνει η ρουτίνα Posix;

 

 

-----Προστέθηκε 19/12/2008 στις 08 : 47 : 44-----

 

 

To BUFSIZ λες έχει μέγεθος 512... Byte ή kilobyte είναι;

Δημοσ.
Τι σημαίνει μηδενισμός του βάθους των φακέλων;

Άλλαξε το με:

Μηδενισμός των χαρακτήρων που τυπώνουμε δεξιά για να δηλώσουμε την ιεραρχία του καταλόγου.

 

Τι σημαίνει η ρουτίνα Posix;

 

Αυτό που λέει η πρόταση, πρόκειται για μια ρουτίνα που ανήκει στις ρουτίνες του ενός στάνταρτ που ονομάζεται “POSIX” και επιτρέπει μεταξύ άλλων την διαχείριση αρχείων & καταλόγων (file system).

 

To BUFSIZ λες έχει μέγεθος 512... Byte ή kilobyte είναι;

 

Bytes!! αφού πρόκειται για ένα απλό char array!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...