Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Ayuda a Pasar Codigo Delphi a C++ (https://www.clubdelphi.com/foros/showthread.php?t=65131)

yelian 23-11-2009 14:58:32

Ayuda a Pasar Codigo Delphi a C++
 
Hola a Todos;
Como estan hacia rato no pasaba por aqui a dejar algunas de mi dudas pero bueno ya me ven aquí, espero que me puedan ayudar, como siempre lo han echo.

Bueno mi duda ahora es como pudiera llevar este código de Delphi a C++, es para eliminar una carpeta con todo su contenido, el código lo e sacado de este mismo foros pero no e podido llevarlo a C++,

Código Delphi [-]uses
ShellApi;

procedure DeleteFolder(Folder: String);
var
FileOpInfo: TShFileOpStruct;

begin
FillChar(FileOpInfo, SizeOf(FileOpInfo), 0);
FileOpInfo.wFunc := FO_DELETE;
FileOpInfo.pFrom := PChar(Folder);
FileOpInfo.fFlags := FOF_NOCONFIRMATION;

ShFileOperation(FileOpInfo);
end;


Mi mayor problema es donde pongo en el C++ el "ShellApi"
No se si sera por que no pongo bien el "ShellApi" pero me da error en "FillChar";

Gracias y Saludos...

escafandra 23-11-2009 18:49:13

Código:

#include <shellapi.h>


DeleteFolder(String Folder)
{
  SHFILEOPSTRUCT FileOpInfo;
  setmem(&FileOpInfo, sizeof(FileOpInfo), 0);
  FileOpInfo.wFunc = FO_DELETE;
  FileOpInfo.pFrom = Folder.c_str();
  FileOpInfo.fFlags = FOF_NOCONFIRMATION;

  SHFileOperation(&FileOpInfo);
}

Saludos.

yelian 23-11-2009 21:33:11

Muchísimas gracias escafandra,

Como siempre de muchísima ayuda para este foros,

Bueno tengo otra duda por preguntar, presida a esta pero no la pongo todavía por que estoy buscando por las paginas que tengo acceso a ver si la puedo solucionar, sino puedo encontrar la respuesta la pongo aquí, para ver si me pueden ayudar como siempre lo hacen,
No la pongo ahora por que no me gusta postear algo que no e buscado antes, pregunto las dudas ya cuando no tengo mas Acternativas de búsqueda.

Bueno Muchísimas Gracias y Saludos a Todos...

yelian 24-11-2009 17:29:48

Hola a todos de nuevo ya esroy a qui de nuevo,
Comos les había contado antes tengo otra duda con otro código,
Pero el de ahora no es problema con el código sino a la hora de llamar a la función.

El código es el siguiente, creo que lo saque de este mismo foros...


void DirList(String sPath, TStrings* strings)
{
TSearchRec sr;
sPath = IncludeTrailingPathDelimiter(sPath);
bool hecho = FindFirst(sPath + "*.*", faAnyFile, sr);
while (!hecho)
{
if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..")
{
strings->Append(sPath + sr.Name);
DirList(sPath + sr.Name, strings);
}
hecho = FindNext(sr);
}
FindClose(sr);
}


No se si lo estoy llamado de forma correcta o el codigo tiene algún problema,

Llamo a la función así

DirList("C:\\prueba\\*", ) ;

Pero no se que voy a poner como segundo parametro de la función,

Bueno les explico un poco mas de lo que quiero hacer,

Mi idea es hacer un Servicio que cada vez que se ejecute me limpie una carpeta (me borre todo el contenido dentro de ella), pero quisiera darles algunas exclusiones , por que una de las carpetas las cual quiero Limpiar es
"Documents and Settings", pero no quiero borrar todas sus carpetas por que saben que hay varias carpetas que no se pueden borrar de hay,

Bueno Saludos y Gracias a todos...

escafandra 24-11-2009 18:49:39

Código:

void DirList(String Dir, TStrings* Salida)
{
    TSearchRec sr;
    if(!FindFirst(Dir + "\\*.*", faAnyFile, sr))
    do{
      if(sr.Name != "." && sr.Name != ".."){
          if(sr.Attr & faDirectory)
            DirList(Dir + "\\" + sr.Name, Salida);
          else
            Salida->Add(Dir + "\\" + sr.Name);
      }
    } while (!FindNext(sr));
    FindClose(sr);
}

Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  DirList("C:\\Archivos de programa", ListBox1->Items);
}

Saludos.

yelian 24-11-2009 20:41:34

Gracias por la Ayuda escafandra

Pero el código me detecta todos los ficheros aunque estén dentro de otro subdirectorio pero no me muestra las carpetas que son las que quiero excluir algunas,

escafandra 24-11-2009 21:08:00

Código:

void Folders(String Dir, TStrings* Salida)
{
    TSearchRec sr;
    if(!FindFirst(Dir + "\\*.*", faAnyFile, sr))
    do{
      Salida->Add(Dir + "\\" + sr.Name);
    } while (!FindNext(sr));
    FindClose(sr);
}

Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Folders("C:\\Documents and Settings", Memo1->Lines);
}

Saludos.

yelian 24-11-2009 21:54:00

Gracias escafandra;

El código me funciona bien pero me saca unas carpetas con puntos que no se que son y no existen, te muestro lo que sale en el Memo

--------------------------------------
C:\Documents and Settings\.
C:\Documents and Settings\..
C:\Documents and Settings\Administrador
C:\Documents and Settings\Administrador.IPIMTZAG
C:\Documents and Settings\All Users
C:\Documents and Settings\amartinez
C:\Documents and Settings\Default User
C:\Documents and Settings\LocalService
C:\Documents and Settings\NetworkService
C:\Documents and Settings\yrodriguez

-----------------------------------------------------

Las dos primeras no se que son, como se pudieran quitar y también como pudiera darles las exclusiones que yo quisiera.

Yo lo que trato de hacer es paserle esta lista a la función de eliminar Carpetas completas

Muchas gracias por la ayuda brindada

escafandra 24-11-2009 22:07:52

Viene desde la época del DOS:
\. es la carpeta actual
\.. es la carpeta anterior (padre)

Saludos.

yelian 26-11-2009 20:32:26

Muchas Gracias escafandra como siempre.

Bueno para el que a ya tenido el mismo problema que yo y no sepa como borrar todo los subdirectorios de una carpeta incluyendo los archivos, aqui les dejo el código que e utilizado para el mismo.

Primero que nada debemos de declarar estas dos funciones.



Codigo Funcion1
//--------------------------------------------------------

void __fastcall TForm1::DeleteFolder(String Folder)
{
SHFILEOPSTRUCT FileOpInfo;
setmem(&FileOpInfo, sizeof(FileOpInfo), 0);
FileOpInfo.wFunc = FO_DELETE;
FileOpInfo.pFrom = Folder.c_str();
FileOpInfo.fFlags = FOF_NOCONFIRMATION;
SHFileOperation(&FileOpInfo);
}

//-----------------------------------------------------

Codigo Funcion2
//--------------------------------------------------------

void __fastcall TForm1::ListarEliminarFolders(String Dir, TStrings* Salida)
{
TSearchRec sr;
if(!FindFirst(Dir + "\\*.*", faAnyFile, sr))
do{
Salida->Add(Dir + "\\" + sr.Name);
if (sr.Name=="." || sr.Name=="..") NULL;
else DeleteFolder(Dir + "\\" + sr.Name);
} while (!FindNext(sr));
FindClose(sr);
}

//---------------------------------------------------------

-En la primera Funcion es para eliminar la carpeta completa que se le pase,

-En la Segunda Función es para listar todos los Archivos y Carpetas dentro de un directorio y Eliminarlos con la Primera Función Declarada,

Le puse un IF para que cuando mande a borrar la lista de Archivos y Carpetas encontrados no me de Error a la hora de borrar estos dos "." y "..", que como escafandra me decía viene de la época del DOS.

Bueno y Como ultimo como se Llama a la Función para eliminar todo el contenido dentro de una Carpeta dejándola a ella intacta.

Código Acción

//------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListarEliminarFolders("C:\\Documents and Settings", Memo1->Lines);
}

Se inserta un Memo1 para ver todos los archivos con las carpeta que existian en el Directorio seleccionado "C:\Documents and Settings".


Bueno cuando encuentre como pudiera ponerles mas carpetas a Excluir lo pasteo, para como ya dije le sirva a alguien que tenga la misma duda que yo, los archivos a Excluir deben de estar en un Fichero aparte...


Bueno Saludos y Muchas gracias a todos.


La franja horaria es GMT +2. Ahora son las 16:24:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi