как бы по простому удалить множество файлов из одной папки одним разом? - страница 2

 
TheXpert писал (а) >>

Согласен.

Просто я к тому, что один вызов лучше, чем собственный велосипедный код, который в случае рекурсивного удаления папки будет не самым простым и маленьким и делать будет то же самое.

тоже согласен!

 
TheXpert >>:

В тихом режиме функцией SHFileOperation. Правда, придется дллку делать.

Посмотрел. Интересная функция!

Вот бы ещё и пример в MQL4...

 
Zhunko >>:

Посмотрел. Интересная функция!

Вот бы ещё и пример в MQL4...

Вадим! привет!

Вадим - бери в руки Си++!  без  него уже никуда, в MQL5 почувствуешь очень... там по идее появятся структуры, элементы ООП надеюсь...

опять же, что бы код защищать от декомпиливрования

можно часть значимых расчетов уводить в DLL  как  для  скорости  - так  и для  защиты

вот посмотри ссылку  

http://www.codeguru.com/cpp/w-p/files/shellapifunctions/article.php/c1293

тут пример удаления группового

// SHFileOperation syntax
WINSHELLAPI int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);

// SHFILEOPSTRUCT layout
typedef struct _SHFILEOPSTRUCT{
 HWND		hwnd;
 UINT		wFunc;
 LPCSTR		pFrom;
 LPCSTR		pTo;
 FILEOP_FLAGS	fFlags;
 BOOL		fAnyOperationsAborted;
 LPVOID		hNameMappings;
 LPCSTR		lpszProgressTitle;
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;


CString OldPath;
CString NewPath;
SHFILEOPSTRUCT shFileOp;

//after filling other members:
shFileOp.fFlags = FOF_WANTMAPPINGHANDLE
                | FOF_RENAMEONCOLLISION;

shFileOp.lpszProgressTitle = "Test";
shFileOp.fAnyOperationsAborted = FALSE;

SHFileOperation(&shFileOp);

if(!shFileOp.hNameMappings)
 return;	//there is nothing further to do, no file collision

struct TMPMAP
{
int Indx;
SHNAMEMAPPING *pMapping;
};

//this will give you a  pointer to the beginning of the 
//array of SHNAMEMAPPING structures
TMPMAP *pTmpMap = (TMPMAP*)shFileOp.hNameMappings;

for(int in = 0; in < pTmpMap->Indx; in++)
{
 SHNAMEMAPPING *pMap = &pTmpMap->pMapping[in];

 //do the same thing for csOldPath
 /*********************************************************/
 char *buf = csNewPath.GetBufferSetLength(pMap->cchNewPath);

strcpy(buf, (char*)pMap->pszOldPath); //see the result of
this,

for(int dw = 0 ; dw < 2 * pMap->cchNewPath - 1 ; dw+=2)
{
*buf = (pMap->pszNewPath[dw]);
buf++;
}
buf = 0;
csNewPath.ReleaseBuffer();  //and see the result of this.
/**********************************************************/
}

//always free it if requested
SHFreeNameMappings(shFileOp.hNameMappings);
















и еще



















CString path="C:\\text.txt";
  path.AppendChar(0);
  path.AppendChar(0);
   
  SHFILEOPSTRUCT shfo={0};
  shfo.wFunc=FO_DELETE;
  shfo.pFrom = path;
  shfo.fFlags=FOF_NOCONFIRMATION;
  shfo.fAnyOperationsAborted=false;
  shfo.hNameMappings=NULL;
  shfo.lpszProgressTitle=NULL;
  SHFileOperation(&shfo);



---

 
#import "kernel32.dll"
   int FindFirstFileA(string path, int& answer[]);
   bool FindNextFileA(int handle, int& answer[]);
#import


//+------------------------------------------------------------------+
 void FileVariablesDeleteAll()
 {
   int win32_DATA[79];
   int handle=FindFirstFileA(TerminalPath()+"\experts\files\*",win32_DATA);

   while (FindNextFileA(handle,win32_DATA)) {
   FileDelete(bufferToString(win32_DATA));
   ArrayInitialize(win32_DATA,0); }
 }
 //+--------------------------------+ 
 string bufferToString(int buffer[])
 {
   string text="";

   for (int pos=11; pos<75; pos++) {
   int curr = buffer[pos];
   text = text + CharToStr(curr & 0x000000FF)
   + CharToStr(curr >> 8 & 0x000000FF)
   + CharToStr(curr >> 16 & 0x000000FF)
   + CharToStr(curr >> 24 & 0x000000FF); }

   return(text);
 }  
 //+------------------------------------------------------------------+




 
sabluk >>:




Спасибо большое! 

Вадим - готовый блок массового удаления старым проверенным и работающим методом!

 
sabluk >>:
А если есть непустые подпапки? SHFileOperation справляется.
 
TheXpert >>:
А если есть непустые подпапки? SHFileOperation справляется.

у меня была простая задача

пробуйте варьировать под свои нужды строку "\experts\files\*"

я имею ввиду маску со звездочкой