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

Διαγραφή φακέλου


dalton85

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

Δημοσ.

Πως μπορω να κανω μια διαγραφει φακελου στην C που ειναι στην επιφανεια εργασιας και ποιο θα ειναι το path για να δουλευει σε οποιονδηποτε υπολογιστη?

Για εργασια ειναι το θεμα.

Δημοσ.

Καταρχήν υποθέτω πως δουλεύεις με 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.

Δημοσ.

Μου βγαζει αυτα τα δυο λαθη:

[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]')

Δημοσ.

Δοκίμασε να αφαιρέσεις το & από το pszPATH (ή szPATH στην νέα έκδοση).

Διόρθωσα το source κώδικα - τώρα πρέπει όλα να δουλεύουν καλά.

 

Υ.Γ.

Πρόκειται για αβλεψία μου (είδες τι παθαίνεις στην C από ένα λανθασμένο & :D) - την πάτησα όμως καθώς στον δικό μου Compiler απλά επιστρέφει ένα warning (το οποίο δεν πρόσεξα) και το πρόγραμμα δούλευε κανονικά.

Δημοσ.

απο γραμμή εντολών ή .bat δεν ειναι πιό απλό;

για αρχείο X.txt στο desktop του ενεργού χρήστη..

DEL %USERPROFILE%\Desktop\X.txt

με την εντολή SET βλέπεις οτι

USERPROFILE=C:\Documents and Settings\user

 

ά! ναι. σε το C θέλεις. οκ βαλε τη c να εκτελέσει το del κλπ,κλπ :)

Δημοσ.

Δεν εχω ασχοληθει καθολου με αντικειμενοστραφη προγραμματισμο. Και τωρα λεω να αρχισω.Μονο δομημενο εχω κανει σε Τ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 τι λαθος κανω ?

Δημοσ.

Καταρχήν δοκίμασες τον διορθωμένο κώδικα μου;

 

Με την βοήθεια της 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 κτλ;

 

Καλή τύχη!

Δημοσ.

Το εχω δοκιμασει ολα οκ αλλα δεν ξερω πως να κανω το εκτελεσιμο αρχειο που θελω. Απο οτι καταλαβα πρεπει πεωτα ναα φτιαξω ενα project για να γινει compile αλλα δεν ξερω μετα πως θα φτιαξω εκτελεσιμο αρχειο.

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

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

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