• Martes 14 de Mayo de 2024, 08:01

Autor Tema:  explorador de archivos  (Leído 2326 veces)

telekito

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
explorador de archivos
« en: Martes 21 de Abril de 2009, 17:17 »
0
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++
  1. fastcall TForm1::TForm1(TComponent* Owner)
  2.         : TForm(Owner)
  3. {
  4.  //............ Esta rutina lo que hace es bucar que unidades hay en mi PC y las visualiza en el componente ListView
  5. UINT Unidades=GetLogicalDrives();
  6.   char Unidad;
  7.   char name[4];
  8.   DIR *d;
  9.   struct dirent *dirp;
  10.   TListItem * Item;
  11.   struct stat fileInfo;
  12.   ListView1->ViewStyle=vsList;
  13.  
  14.   name[1]=':'; name[2]='\';
  15.   for(int i=0; i<26; i++){
  16.      if (Unidades & (int)pow(2,i)){
  17.  
  18.         Unidad=(char)((i+'A'));
  19.         name[0]=Unidad;
  20.         Item=ListView1->Items->Add();
  21.         Item->Caption = name;
  22.         Item->ImageIndex=0;
  23.  
  24.       }
  25.    }
  26.  
  27.  
  28. }
  29.  
  30. //---------------------------------------------------------------------------
  31.  
  32. void __fastcall TForm1::DobleClickl(TObject *Sender)   // Al hacer doble click en una carpeta la abre y explora su contenido
  33. {
  34.    TListItem * Item;
  35.    DIR* dir=NULL;
  36.     struct dirent* stdir;
  37.     struct stat fileInfo;
  38.     struct ffblk st;
  39.  
  40.    Item=ListView1->Selected;
  41.    AnsiString camino;
  42.  
  43.  
  44.    camino=Ruta->Text;   // Un TMemo para guardar la última ubicación
  45.    if (camino=="rn")     // Estoy visualizando las unidades
  46.     {
  47.       strcpy(camino.c_str(),Item->Caption.c_str());
  48.       Ruta->Text=(camino.c_str());
  49.  
  50.      }
  51.    else   // si estoy en cualquier otra ruta
  52.     {
  53.  
  54.       strcat(camino.c_str(),Item->Caption.c_str());
  55.       strcat(camino.c_str(),"\");
  56.  
  57.       Ruta->Text=(camino.c_str());
  58.     }
  59.  
  60.    dir=opendir(camino.c_str()); //Abrimos el directorio
  61.  
  62.    ListView1->Clear();  // Limpiamos la lista
  63.    while( (dir!=NULL)&&(stdir = readdir(dir))!=NULL  )
  64.     {
  65.  
  66.           Item=ListView1->Items->Add();
  67.           Item->Caption = stdir->d_name;
  68.           strcat(camino.c_str(),stdir->d_name);
  69.           stat(camino.c_str(), &fileInfo);
  70.           // determinamos que tipo de archivo es... (archivo regular, directorio...)
  71.  
  72.           if( S_ISDIR(fileInfo.st_mode) )
  73.               Item->ImageIndex=0;  // Uso un componente ImageList para ponerle un icono
  74.  
  75.           else
  76.                Item->ImageIndex=2;
  77.  
  78.           //Recuperamos la ruta del directorio que se está recorriendo
  79.           strcpy(camino.c_str(),Ruta->Text.c_str());
  80.     }
  81.     closedir(dir);
  82.   
  83. }
  84.  


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

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: explorador de archivos
« Respuesta #1 en: Viernes 24 de Abril de 2009, 12:35 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: explorador de archivos
« Respuesta #2 en: Sábado 25 de Abril de 2009, 18:10 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: explorador de archivos
« Respuesta #3 en: Viernes 1 de Mayo de 2009, 13:33 »
0
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