dalton85 Δημοσ. 25 Μαΐου 2007 Δημοσ. 25 Μαΐου 2007 Πως μπορω να κανω μια διαγραφει φακελου στην C που ειναι στην επιφανεια εργασιας και ποιο θα ειναι το path για να δουλευει σε οποιονδηποτε υπολογιστη? Για εργασια ειναι το θεμα.
Directx Δημοσ. 25 Μαΐου 2007 Δημοσ. 25 Μαΐου 2007 Καταρχήν υποθέτω πως δουλεύεις με MS-Windows, σε αυτή την περίπτωση για να βρεις το Path προς το Desktop θα πρέπει να χρησιμοποιήσεις την WinAPI ρουτίνα SHGetFolderPath, ύστερα να διαγράψεις τον υπό-κατάλογο που θέλεις από το Desktop (μαζί με τυχόν δικούς του υποκατάλογους) δες την SHFileOperation.. Ακολουθεί ένα απλό παράδειγμα που δοκιμάζει να διαγράψει τον φάκελο TestMe από το Desktop του τρέχοντα χειριστή.. > /*-Delete a Desktop sub-folder-----------------------------------------------*/ #include <windows.h> #include <shlobj.h> #include <stdio.h> #ifdef __BORLANDC__ #pragma hdrstop /* CodeGear Turbo-C++ Magic */ #endif /*--------------------------------------------------------------------------*/ #ifdef __BORLANDC__ #pragma argsused/* CodeGear Turbo-C++ Magic */ #endif int main(int argc, char* argv[]) { char szPATH[MAX_PATH] = ""; SHFILEOPSTRUCT SFOS; /* Get Desktop directory for current user (-1) */ if(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, (HANDLE)-1, SHGFP_TYPE_CURRENT, szPATH)!=S_OK) printf(" SHGetFolderPath failed!\n"); else { /* Lets delete TestMe folder from current user Desktop.. */ lstrcat(szPATH,"\\TestMe"); printf(" Desktop path for current user: \"%s\"\n",szPATH); /* Setup SHFILEOPSTRUCT struct for use with SHFileOperation */ ZeroMemory(&SFOS,sizeof(SFOS)); SFOS.hwnd = NULL; SFOS.wFunc= FO_DELETE; SFOS.pFrom= szPATH; /* Call SHFileOperation */ if(SHFileOperation(&SFOS)) /* If non-zero, then failure of some sort */ printf(" SHFileOperation failed!\n"); else if(SFOS.fAnyOperationsAborted) /* Did user abort SHFileOperation? */ printf(" User abort SHFileOperation..\n"); } return 0; } /*---------------------------------------------------------------------------*/ Υ.Γ. Το πρόγραμμα αναπτύχθηκε σε CodeGear Turbo C++ Explorer, και φυσικά μπορεί να περιέχει bugs - κάνει διαγραφή δεδομένων οπότε το τρέχεις με δικιά σου ευθύνη! Για περισσότερες πληροφορίες επί του θέματος (πχ. περί δικαιωμάτων χειριστή στην SHGetFolderPath, πλήρεις ρυθμίσεις SHFileOperator) διαβάστε οπωσδήποτε τα ανάλογα θέματα στο MSDN ή στο Windows SDK Help.
dalton85 Δημοσ. 25 Μαΐου 2007 Μέλος Δημοσ. 25 Μαΐου 2007 Μου βγαζει αυτα τα δυο λαθη: [C++ Error] File1.cpp(24): E2034 Cannot convert 'char ( *)[260]' to 'char *' [C++ Error] File1.cpp(24): E2342 Type mismatch in parameter 'pszPath' (wanted 'char *', got 'char ( *)[260]')
Directx Δημοσ. 25 Μαΐου 2007 Δημοσ. 25 Μαΐου 2007 Δοκίμασε να αφαιρέσεις το & από το pszPATH (ή szPATH στην νέα έκδοση). Διόρθωσα το source κώδικα - τώρα πρέπει όλα να δουλεύουν καλά. Υ.Γ. Πρόκειται για αβλεψία μου (είδες τι παθαίνεις στην C από ένα λανθασμένο & ) - την πάτησα όμως καθώς στον δικό μου Compiler απλά επιστρέφει ένα warning (το οποίο δεν πρόσεξα) και το πρόγραμμα δούλευε κανονικά.
random Δημοσ. 25 Μαΐου 2007 Δημοσ. 25 Μαΐου 2007 απο γραμμή εντολών ή .bat δεν ειναι πιό απλό; για αρχείο X.txt στο desktop του ενεργού χρήστη.. DEL %USERPROFILE%\Desktop\X.txt με την εντολή SET βλέπεις οτι USERPROFILE=C:\Documents and Settings\user ά! ναι. σε το C θέλεις. οκ βαλε τη c να εκτελέσει το del κλπ,κλπ
dalton85 Δημοσ. 25 Μαΐου 2007 Μέλος Δημοσ. 25 Μαΐου 2007 Δεν εχω ασχοληθει καθολου με αντικειμενοστραφη προγραμματισμο. Και τωρα λεω να αρχισω.Μονο δομημενο εχω κανει σε Τurbo C 2.01. Απλα εχουμε μια εργασια να φτιαξουμε ενα προγραμμα που στο backround κανει δουλεια ιου(διαγραφει ενα αρχειο) και το ειπα να ψαξω και αλλες πτυχες. Ευχαριστω και παλη για την βοηθεια σας. Μηπος υπαρχει κανα βιβλιο για για την Turbo C++ στα ελληνικα για να ειναι πιο ευκολο να την μάθω BOOL DeleteDirectory(const TCHAR* sPath) { HANDLE hFind; // file handle WIN32_FIND_DATA FindFileData; TCHAR DirPath[MAX_PATH]; TCHAR FileName[MAX_PATH]; _tcscpy(DirPath,sPath); _tcscat(DirPath,_T("\\")); _tcscpy(FileName,sPath); _tcscat(FileName,_T("\\*")); // searching all files hFind = FindFirstFile(FileName, &FindFileData); // find the first file if( hFind != INVALID_HANDLE_VALUE ) { do { if( IsDots(FindFileData.cFileName) ) continue; _tcscpy(FileName + _tcslen(DirPath), FindFileData.cFileName); if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { // we have found a directory, recurse if( !DeleteDirectory(FileName) ) break; // directory couldn't be deleted } else { if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) _chmod(FileName, _S_IWRITE); // change read-only file mode if( !DeleteFile(FileName) ) break; // file couldn't be deleted } }while( FindNextFile(hFind,&FindFileData) ); FindClose(hFind); // closing file handle } return RemoveDirectory(sPath); // remove the empty (maybe not) directory } To παραπανω κωδικα τον βρηκα εδω http://www.codeproject.com/file/deletedir.asp?df=100&forumid=135959&exp=0&select=1589875#xx1589875xx Στη Turbo c++ μου βγαζει error E2141 declaration syntax error τι λαθος κανω ?
Directx Δημοσ. 26 Μαΐου 2007 Δημοσ. 26 Μαΐου 2007 Καταρχήν δοκίμασες τον διορθωμένο κώδικα μου; Με την βοήθεια της SHFileOperation δεν χρειάζεται να κάνεις μόνο σου την διαγραφή φακέλων & αρχείων (αναζήτηση υποφακελών - διαγραφή αρχείων - αφαίρεση φακέλου κτλ.) οπότε γλυτώνεις ένα σορό κόπο. Όσον αφορά το πρόγραμμα σου τώρα, οι ρουτίνες tcxxx (πχ. tcscat, tcslen, tcscpy κτλ.) από ότι είδα ανήκουν στην βιβλιοθήκη MFC (ασφαλείς εντολές διαχείρισης strings) οπότε δοκίμασε να το κάνεις compile με την Microsoft Visual C++ 6.0 για παράδειγμα. Εναλλακτικά μπορείς να μετατρέψεις αυτές τις εντολές σε WinAPI κλήσεις όπως περιγράφεται εδώ: http://216.239.59.104/search?q=cache:8wa25W1HH0UJ:www.tutorials-ke.com/MFC/Converting-Visual/+tcscpy+MFC&hl=el&ct=clnk&cd=5 Υ.Γ. Υπάρχει επίσης μια ρουτίνα _IsDot που ελπίζω ότι έχεις την πλήρη δήλωση της (και κώδικα, σωστά; ). Από ότι είδα απλά ελέγχει για τους εικονικούς '.' (τρέχον folder) & '..' (πατρικό-folder) φακέλους οπότε όταν τους βρει απλά κάνει continue στο do{ }while; loop ώστε ο κώδικας να μην ασχολείται μαζί τους. Επίσης στο τέλος η ρουτίνα κάνει recursive στην RemoveDirectory - είναι άλλη ρουτίνα ή μήπως απλά πρόκειται για την ίδια οπότε θα έπρεπε να μετονομαστεί σε return DeleteDirectory κτλ; Καλή τύχη!
dalton85 Δημοσ. 26 Μαΐου 2007 Μέλος Δημοσ. 26 Μαΐου 2007 Το εχω δοκιμασει ολα οκ αλλα δεν ξερω πως να κανω το εκτελεσιμο αρχειο που θελω. Απο οτι καταλαβα πρεπει πεωτα ναα φτιαξω ενα project για να γινει compile αλλα δεν ξερω μετα πως θα φτιαξω εκτελεσιμο αρχειο.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.