sidiropoulosga Δημοσ. 8 Φεβρουαρίου 2010 Δημοσ. 8 Φεβρουαρίου 2010 Για σας. Εχω 2 Editbox και το καθένα έχει ένα path (από και πρός αντίστοιχα). πως θα κάνω την αντιγραφή απο το ενα στο άλλο; Ευχαριστώ
Directx Δημοσ. 9 Φεβρουαρίου 2010 Δημοσ. 9 Φεβρουαρίου 2010 Μπορείς να το κάνεις με διάφορους τρόπους (μπορείς να γράψεις μια ρουτίνα βασιζόμενη στο TFileStream της VCL αν έχεις κέφι). O πιο γρήγορος όμως και ο λιγότερο .. δια-δραστικός προς τον χρήστη τρόπος είναι με την βοήθεια της Windows API ρουτίνας CopyFile, για παράδειγμα: > if(!CopyFile(EditSource->Text.c_str(), EditDest->Text.c_str(), FALSE)) throw Exception("CopyFile failed!"); Το FALSE flag ορίζει ότι αν το αρχείο υπάρχει ήδη στο path του EditDest μπορεί να γίνει overwrite από την CopyFile, διαφορετικά το γυρίζεις σε TRUE. Σημ: Το EditDest πρέπει να δείχνει σε κάποιο full-path (δηλαδή διαδρομή + όνομα αρχείου, πχ: “C:\MyFile.dat”). (Για περισσότερες πληροφορίες δες εδώ) Αν η CopyFile είναι η πιο εύκολη και λιγότερο ευέλικτη ρουτίνα αντιγραφής αρχείων τότε .. Ο πιο δια-δραστικός τρόπος από την άλλη πλευρά είναι να ζητήσεις από το shell των Windows να κάνει την αντιγραφή του αρχείου σου για εσένα παρουσιάζοντας μάλιστα (αν θες) το γνωστό παράθυρο αντιγραφής αρχείων που γνωρίζεις από τον Explorer μέσο της ρουτίνας SHFileOperation. Και εδώ φυσικά θα χρειασθείς Windows API, για παράδειγμα: > try { // Copy using standard Shell dialog. SHFILEOPSTRUCT SFOS; ZeroMemory(&SFOS, sizeof(SHFILEOPSTRUCT)); SFOS.hwnd = Handle; SFOS.wFunc= FO_COPY; SFOS.pFrom= (EditSource->Text + "\0").c_str(); SFOS.pTo = EditDest->Text.c_str(); if(SHFileOperation(&SFOS) != 0) if(!SFOS.fAnyOperationsAborted) /* User abort? */ throw Exception("SHFileOperation failed!"); } catch(Exception &ex) { Application->ShowException(&ex); } Το .hwnd δέχεται το HWND του παραθύρου σου το οποίο παρέχεται ως Handle από το TForm της VCL. Στο .wFunc ορίζεις την υπηρεσία που επιθυμείς (FO_COPY = Αντιγραφή αρχείου/ων). Στο .pFrom ορίζεις το Source από το οποίο θα αντιγράψεις το αρχείο σου. Το .pFrom έχει ένα μικρό τρικ, πρέπει να τελειώνει με διπλό NULL (για αυτό το +”\0”) και αυτό γιατί μπορείς να ορίσεις λίστα αρχείων. Στο .pTo ορίζεις το Destination path στο οποίο θα αντιγραφτεί το αρχείο σου. Αν το Destination path δεν περιλαμβάνει όνομα αρχείου, θα χρησιμοποιηθεί το όνομα αρχείου του .pFrom διαφορετικά θα χρησιμοποιηθεί το όνομα αρχείο που ορίζεις στο .pTo. Με αυτά εκτελείς την SHFileOperation η οποία επιστρέφει != 0 αν κάτι έχει πάει στραβά ή έχει ακυρώσει την διαδικασία ο χρήστης. Αν το .fAnyOperationsAborted λοιπόν είναι true τότε απλά ο χρήστης ακύρωσε την αντιγραφή διαφορετικά παρουσιάσθηκε κάποιο σφάλμα. Φυσικά η SHFileOperation δέχεται πολλά ορίσματα και προσφέρει αρκετές ακόμα υπηρεσίες οπότε για περισσότερα δες εδώ). Υ.Γ. Υπάρχουν και άλλες μέθοδοι αντιγραφής όπως η CopyFileEx η οποία προσφέρει δυνατότητα ακύρωσης και επιστροφή της κατάστασης εξέλιξης της αντιγραφής στην εφαρμογή σου λειτουργώντας όπως περίπου η απλή CopyFile (βλ. εδώ). Καλή συνέχεια!
sidiropoulosga Δημοσ. 10 Φεβρουαρίου 2010 Μέλος Δημοσ. 10 Φεβρουαρίου 2010 Ευχαριστω πολυ φίλε μου για τη βοηθεια σου. ολα αυτα που μου εστηλες ειναι η λογική απάντηση στην ερωτηση μου. ενα προβλημα που εμφανίζετε τωρα ειναι το παρακάτω. E2034 Cannot convert 'wchar_t *' to 'const char *' ο κώδικας είναι οπως ακριβώς μου τον έστηλες, απλα άλαξα τα EditSource, EditDest με τα Edit80 και Edit81 αντίστοιχα στα οποία μεσα έχω π.χ Edit80->Text="C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg"; Edit81->Text="D:\\mylogo.jpg"; try { // Copy using standard Shell dialog. SHFILEOPSTRUCT SFOS; ZeroMemory(&SFOS, sizeof(SHFILEOPSTRUCT)); SFOS.hwnd = Handle; SFOS.wFunc= FO_COPY; SFOS.pFrom = (Edit80->Text+ "\0").c_str(); SFOS.pTo =Edit81->Text.c_str(); if(SHFileOperation(&SFOS) != 0) if(!SFOS.fAnyOperationsAborted) ///User abort? throw Exception("SHFileOperation failed!"); } catch(Exception &ex) { Application->ShowException(&ex); } Ευχαριστώ πολυ!!! ---------- Προσθήκη στις 17:08 ---------- Προηγούμενο μήνυμα στις 16:38 ---------- 5 λεπτα μετά που σε έστηλα την απάντηση βρήκα και τη λύση. απλα έπρεπε να ορισω τα EditBox έτσι Edit80->Text.t_str() Edit81->Text.t_str() Ευχαριστώ.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.