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

ms-dos 'move' to c


georginos1989

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

Δημοσ.

Σε ένα μάθημα στο τει μας έβαλαν να κάνουμε project. Εγώ έχω "Προσομοίωση της εντολής “MOVE” με πρόγραμμα σε γλώσσα C++ με συμπερίληψη όλων των δυνατών επιλογών (options) της αρχικής εντολής του DOS."

 

Όποιος θέλει μπορεί να βοηθήσει

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

 

Η αν βρείτε για την εντολή 'tree' το ιδιο...

Δημοσ.

Καθώς η πολιτική του forum αποθαρρύνει την δημοσίευση λύσεων επί ασκήσεων θα αρκεστώ στο να υπενθυμίσω πως η move είναι μια copy που ύστερα κάνει delete το προγενέστερο source της -φυσικά υπάρχουν πολλοί τρόποι να το κάνεις αυτό διότι παίζει ρόλο και ο χώρος της μονάδας σου αλλά αυτό θα πρέπει να το ξέρεις ήδη από την θεωρία.

Δημοσ.
Καλα μη βοηθάτε.. Πάντως εμείς δεν έχουμε κάνει τπτ απο ms-dos. Kai c κάνουμε σε αυτό το εξάμηνο οπότε δεν την ξέρω απο έξω

 

Εγώ να σε βοηθήσω - αλλά ξέρεις ποία θα είναι η τύχη του θέματος τότε; Άμεση διαγραφή, εγώ δεν καθορίζω τους κανόνες του forum, απλά "παίζω" με αυτούς. Επ' ευκαιρίας μάλιστα να εξηγήσω και κάτι προς όλους τους ενδιαφερόμενους (που κάποτε μπορεί να βοήθησα και τώρα δεν μπορώ) .. Είναι μεγάλη απογοήτευση να δημοσιεύσεις απαντήσεις για να διαγραφούν λίγα λεπτά ή μερικές ώρες μετά! Αν ψάξεις σε παλαιότερα θέματα θα δεις τόνους (κυριολεκτικά!) κώδικα που έχω δημοσιεύσει εδώ και 7 χρόνια για σπουδαστές & φοιτητές, φοιτήτριες -- κάποια στιγμή όμως το πράγμα ξέφυγε καθώς κάποιοι το είδαν σαν μέθοδο πλουτισμού (πουλούσαν τις λύσεις σε αδαείς, απελπισμένους) άλλοι ζητούσαν λύσεις ακόμα και για ασκήσεις σε επίσημους Διαγωνισμούς κτλ.. και η πολιτική (ορθός) άλλαξε, δεν είναι δικό μου θέμα όμως αυτό, οπότε δεν έχω και λόγο να συνδέομαι τόσο συχνά στο forum ... :-(

 

Οπότε το μόνο που μπορώ να κάνω είναι να σου δώσω μια κατεύθυνση προς την λύση - όχι την λύση, αν ξέρεις να κάνεις copy ένα αρχείο σε C και να σβήνει ένα αρχείο επίσης με αυτή, ε είσαι σχεδόν έτοιμος.

 

Ειλικρινά

Καλή τύχη.

Δημοσ.

κι άν είμαστε φτωχόπαιδα

βοηθείστε μας να πάρουμε

κι' απο πέντ'έξι οικόπεδα !

 

Δ. Φωτόπουλος, απο ελληνική ταινία

 

 

γειά σου Directx

νομίζω άλλος* πρέπει να "απολογηθεί".

 

*δεν εννοώ το forum

.

Δημοσ.
Εγώ να σε βοηθήσω - αλλά ξέρεις ποία θα είναι η τύχη του θέματος τότε; Άμεση διαγραφή, εγώ δεν καθορίζω τους κανόνες του forum, απλά "παίζω" με αυτούς.

 

Ας το ξαναγράψω, γιατί μου φαίνεται δεν το προσέξατε την προηγούμενη φορά που το ανέφερα: Την τελευταία φορά που τέθηκε ως θέμα συζήτησης στη συντονιστική ομάδα του φόρουμ τα threads που ζητούν έτοιμες λύσεις ασκήσεων και τα ακόλουθα posts, το consensus ήταν ότι δε θα σβήνονται και ο καθένας έχει την ευθύνη των πράξεών του.

 

Επίσης, δεν υπάρχει καμμία σχετική αναφορά στους Όρους Χρήσης του forum. Μήπως στο παρελθόν σβήστηκαν posts σου γιατί έκανες quote μηνυμάτων γραμμένων σε greeklish; Ή μήπως διαγράφηκε ολόκληρο το θέμα, γιατί το 1ο post ήταν σε greeklish; Αυτός είναι ο πιο πιθανός λόγος και θυμάμαι χαρακτηριστικά να έχω κάνει πολλές φορές report τέτοια threads/μηνύματα/[απαντήσεις σε αυτά που περιέχουν greeklish quotes] εδώ στο subforum του Προγραμματισμού...

Δημοσ.

@parsifal

Ok, ευχαριστώ για την διευκρίνηση :-)

 

@gtroza

Είναι απαραίτητο από ότι φαίνεται :-D

 

@georginos1989

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

 

Η φιλοσοφία είναι αυτή που περιέγραψα στην αρχή, διαβάζουμε το αρχείο που θέλουμε να μετακινήσουμε στην μνήμη του υπολογιστή μας, το σβήνουμε από την μονάδα και ύστερα το γράφουμε στον νέο του προορισμό.

 

Αυτή μέθοδος έχει ένα μειονέκτημα όμως, υποθέτει ότι ο υπολογιστής έχει αρκετή μνήμη (φυσική ή εικονική) ώστε να αποθηκευτεί εκεί το προς μεταφορά αρχείο. Το πλεονέκτημα της είναι ότι η μεταφορά του αρχείου γίνεται γρήγορα καθώς η μεταφορά εκτελείται σε μια I/O κλήση.

 

Συνεπώς σε παλαιότερα λειτουργικά συστήματα δεν δουλεύει, εκεί καλύτερη λύση (εκτός της πολύ απλής byte-2-byte copy) είναι η ανάγνωση σε μπλοκ (πχ. 64KB) του αρχείου και η παράλληλη εγγραφή τους στο νέο προορισμό, ενώ παράλληλα θα πρέπει να τροποποιούμε το μέγεθος του μεταφερόμενου αρχείου ώστε να είμαστε σίγουροι ότι θα διατηρηθεί ο απαραίτητος αποθηκευτικός χώρος στην μονάδα (αν είναι μεταφορά στην ίδια μονάδα πάντα).

 

Όπως και να έχει, αυτός είναι ο κώδικας από εμένα:

 

>
int _MoveFile(char *pszSource, char *pszDest)
{
/*
 * Αντιγραφή του pszSource στο pszDest και διαγράφη του πρώτου.
 *
 * Η αντιγραφή εκμεταλεύεται την διαθέσιμη μνήμη του Λ.Σ. για γρήγορη
 * διεκπαιρέωση (αυτό μπορεί να είναι μειονέκτιμα όμως υπό συνθήκες)
 */
FILE *fStream, *fStreamD = NULL;
char *pbyBuffer = NULL;
long lLength;

if(access(pszSource, 0) ==-1)
 {
	printf("File not found - \"%s\"\n", pszSource);
	return -1;
 }

if((fStream = fopen(pszSource, "rb")) == NULL)
 {
	printf("Read access denied - \"%s\"\n", pszSource);
	return -2;
 }

/* Ας μάθουμε το μέγεθος του αρχείου */
if(fseek(fStream, 0, SEEK_END) !=0 )
 {
	printf("File seek failed - \"%s\"\n", pszSource);
	fclose(fStream);
	return -3;
 }
if((lLength = ftell(fStream)) == -1L)
 {
	printf("File tell failed - \"%s\"\n", pszSource);
	fclose(fStream);
	return -4;
 }
/* Γυρίζουμε στην αρχή του Stream */
rewind(fStream);

/* Δέσμευση μνήμης */
if((pbyBuffer = (char*)malloc(lLength + 1)) == NULL)
 {
	printf("Not enough memory!\n");
	fclose(fStream);
	return -5;
 }

/* Αποθήκευση στην μνήμη */
if(fread(pbyBuffer, lLength, 1, fStream) != 1)
 {
	printf("Read I/O error - \"%s\"\n", pszSource);
	fclose(fStream);
	free(pbyBuffer);
	return -6;
 }

fclose(fStream);

/*
 * Διαγραφή αρχείου από την μονάδα
 */
if(unlink(pszSource) == -1)
 {
	printf("Cannot delete file - \"%s\"\n", pszSource);
	free(pbyBuffer);
	return - 7;
 }

/* Δημιουργία προορισμού */
if((fStreamD = fopen(pszDest, "wb")) == NULL)
 {
	printf("Cannot create file - \"%s\"\n", pszDest);
	free(pbyBuffer);
	return -8;
 }

/* Εγγραφή δεδομένων στο προορισμό */
if(fwrite(pbyBuffer, lLength, 1, fStreamD) != 1)
 {
	printf("Write I/O error - \"%s\"\n", pszDest);
	fclose(fStreamD);
	free(pbyBuffer);
	/* Διαγραφή ημιτελούς pszDest από την μονάδα */
	unlink(pbyBuffer);
	return -9;
 }

/* Αποδέσμευση τοπικών πόρων */
fclose(fStreamD);
free(pbyBuffer);

return 0;
}

 

Η ρουτίνα απαιτεί τις βιβλιοθήκες stdio.h, stdlib.h και io.h για το POSIX access & unlink. Τέλος σε περίπτωση που υπάρξει πρόβλημα με την rewind, μπορείς να την αντικαταστήσεις με μια fseek(fStream, 0, SEEK_SET);

 

Υ.Γ.

Η ρουτίνα έχει δοκιμασθεί σε CodeGear Turbo C++, μπορεί να περιέχει λάθει ή άλλες αβλεψίες.

 

Τα υπόλοιπα θα τα βρεις εσύ, happy programming!

:-)

Δημοσ.

Να σημειώσω πως το παραπάνω παράδειγμα του Directx αφορά αποκλειστικά τη "θεωρητική αναζήτηση" στα πλαίσια της άσκησης του georginos1989, αφού πρακτικά είναι ασύμφορη εν συγκρίσει με τη move που θα εκτελούσε μια κλήση στο σύστημα. Αυτό διότι έχει τα μειονεκτήματα α) να σβήνει και να γράφει εκ νέου το αρχείο ακόμα κι αν πρόκειται για τον ίδιο δίσκο (αντίθετα με τις move του συστήματος που αν πρόκειται για μετακίνηση στον ίδιο δίσκο απλά αλλάζουν την πληροφορία θέσης στο σύστημα αρχείων και όχι τη φυσική θέση του αρχείου) και β) απαιτεί διαθέσιμη μνήμη ίση με το μέγεθος του αρχείου (!).

Δημοσ.

ζήτησε βοήθεια και για την tree

.

 

 

-----Προστέθηκε 16/11/2008 στις 03 : 22 : 51-----

 

http://en.wikipedia.org/wiki/File_Allocation_Table

 

An Inside Look at MS-DOS

The design decisions behind the popular operating system

Tim Paterson

Seattle Computer Products

1114 Industry Dr.

Seattle, WA 98188

 

http://www.patersontech.com/Dos/Byte/InsideDos.htm

 

πιό "πίσω" δεν γίνεται :mrgreen:

.

Δημοσ.

@PCharon:

Κοίταξε να δεις, αν ο καθηγητής του, του επιτρέπει μετακίνηση με την βοήθεια του API που προσφέρει το λειτουργικό σύστημα (θα το έκανα με μια SHFileOperation ή την MoveFileEx για παράδειγμα σε Windows API ή με την POSIX rename σε C), ουδέν πρόβλημα το χρησιμοποιεί και είναι ο καλύτερος του χωριού (δεν το συζητάμε καν), αν από την άλλη πλευρά οφείλει να γράψει μόνος του κάτι ανάλογο, τότε τα περιθώρια του είναι περιορισμένα.

 

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

 

@gtroza:

Πράγματί, ευκαιρία και για τους υπόλοιπους φίλους να συνεισφέρουν αν το επιθυμούν ;)

 

Btw. κλασσικό έγγραφο το κείμενο του Paterson (αλλά αν θες να πας στην πηγή του DOS 1.0 πρέπει να δεις το DR-CP/M), α ρε εποχές!

Δημοσ.

Οι καθηγητές δεν μας έχουν πει κανένα τρόπο πως να το κανουμε. Απλώς είπαν μόνο να κάνουμε τη μετατροπή σε c . Λογικά με όσα έχουμε μάθει γιατί αλλιώς θα καταλάβουν ότι δεν το κάναμε μόνοι μας..... Εμείς SHFileOperation ή την MoveFileEx δεν έχουμε μαθει...

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

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

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