Programación General > C++ Builder

 explorador de archivos

(1/1)

telekito:
Hola a todos. Estoy realizando un explorador de archivos con builder c++ 6.0 bajo windows vista; para ello uso un componente ListView:

--- Código: C++ ---fastcall TForm1::TForm1(TComponent* Owner)        : TForm(Owner){ //............ Esta rutina lo que hace es bucar que unidades hay en mi PC y las visualiza en el componente ListViewUINT Unidades=GetLogicalDrives();  char Unidad;  char name[4];  DIR *d;  struct dirent *dirp;  TListItem * Item;  struct stat fileInfo;  ListView1->ViewStyle=vsList;   name[1]=':'; name[2]='\';  for(int i=0; i<26; i++){     if (Unidades & (int)pow(2,i)){         Unidad=(char)((i+'A'));        name[0]=Unidad;        Item=ListView1->Items->Add();        Item->Caption = name;        Item->ImageIndex=0;       }   }  } //--------------------------------------------------------------------------- void __fastcall TForm1::DobleClickl(TObject *Sender)   // Al hacer doble click en una carpeta la abre y explora su contenido{   TListItem * Item;   DIR* dir=NULL;    struct dirent* stdir;    struct stat fileInfo;    struct ffblk st;    Item=ListView1->Selected;   AnsiString camino;     camino=Ruta->Text;   // Un TMemo para guardar la última ubicación   if (camino=="rn")     // Estoy visualizando las unidades    {      strcpy(camino.c_str(),Item->Caption.c_str());      Ruta->Text=(camino.c_str());      }   else   // si estoy en cualquier otra ruta    {       strcat(camino.c_str(),Item->Caption.c_str());      strcat(camino.c_str(),"\");       Ruta->Text=(camino.c_str());    }    dir=opendir(camino.c_str()); //Abrimos el directorio    ListView1->Clear();  // Limpiamos la lista   while( (dir!=NULL)&&(stdir = readdir(dir))!=NULL  )    {           Item=ListView1->Items->Add();          Item->Caption = stdir->d_name;          strcat(camino.c_str(),stdir->d_name);          stat(camino.c_str(), &fileInfo);          // determinamos que tipo de archivo es... (archivo regular, directorio...)           if( S_ISDIR(fileInfo.st_mode) )              Item->ImageIndex=0;  // Uso un componente ImageList para ponerle un icono           else               Item->ImageIndex=2;           //Recuperamos la ruta del directorio que se está recorriendo          strcpy(camino.c_str(),Ruta->Text.c_str());    }    closedir(dir);  } 

El problema es que con ciertas carpetas (Ej: Archivos de programa, windows...) ocurre una excepción de violación de memoria y no consigo solucionarlo. He comprobado que en esos casos la varible dir toma el valor NULL.  Agradecería cualquier ayuda, muchas gracias  ;)

phobos:
Hola.

En Vista, debido al UAC (User Account Control), determinadas carpetas están "blindadas". Cuando se intenta acceder a ellas o escribir, pide elevación de permisos. Si tu programa no tiene en cuenta que cuando el sistema requiera elevación se la pida al usuario, o directamente por código se la otorgue, es posible que el sistema deniegue la petición y genere un error en tiempo de ejecución. Prueba a ejecutar el programa con la opción del botón derecho "Ejecutar como administrador". Si te funciona de esta manera, deberás modificar tu programa para que se solicite elevación (o avisar que siempre se ejecute como administrador).
Consulta este link: msdn.microsoft.com/en-us/library/bb530410.aspx
Una de las soluciones es generar un fichero manifest adecuado, pero con C++Builder 6 no se puede. Sinceramente te digo que intentar manejar a nivel de código el UAC, sin las herramientas adecuadas es un infierno.

Saludos.

telekito:
Gracias por la respuesta. Este explorador es un subprograma de un proyecto de fin de carrera que estoy realizando para transferir archivos entre un cliente y un servidor; así que quizas no visualize esas carpetas a efectos prácticos del usuario que a fin de cuentas le interesará intercambiar archivos personales de sus carpetas. De todas formas intentaré conseguir un builder mas actualizado que corra bien en Vista a ver si así se resolviera el problema.

Muchas gracias

telekito:
SOLUCIONADO!!!  

He reescrito el código pero usando las funciones de la libreria dir.h (findfirst, findnext, etc etc), y de esta manera no me da ningun problema  B)

Un saludo a todos

Navegación

[0] Índice de Mensajes

Ir a la versión completa