<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hola a todos.<br>
    <br>
    Mi principal duda es la siguiente: <br>
        A falta de conocer alguna biblioteca dedicada a esto, estoy
    creando una clase que me permita navegar entre directorios, y el
    caso es que para las opciones de configuración me gustaria utilizar
    banderas pero no tengo muy claro como funcionan los operadores de
    bits...<br>
    Estoy aprendiendo por mi cuenta, por tanto perdonadme si meto tanto
    código, si alguien desea ver todo el código tan solo pedírmelo y lo
    subo a github.com, muchas gracias de antemano...<br>
    <br>
    De momento lo que tengo es lo siguiente:<br>
    <br>
    <font color="#9999ff">// tengo declaradas unas pocas constantes</font><br>
    <br>
    <font color="#009900">#define MOSTRAR_OCULTOS     0<br>
      #define INVERTIR_ORDEN         1<br>
      #define ORDENA_TAMAÑO        2<br>
      #define ORDENA_EXTENSION   3<br>
      //__etc.__</font><br>
    <br>
    <font color="#9999ff">// y dentro de mi clase he creado un struct
      tal que asi:</font><br>
    <br>
    <font color="#000099">struct</font> conf<br>
            {                                 <font color="#9999ff">/**<
      ls = comando de consola Linux (muestra contenido directorio) */</font><br>
                <font color="#000099">bool</font> archOcultos;   <font
      color="#9999ff">/**< ls -all muestra todos los archivos,
      incluidos los ocultos */</font><br>
                <font color="#000099">bool</font> invertir;           <font
      color="#9999ff">/**< ls -r ordena el resultado en orden inverso
      */</font><br>
                <font color="#000099">bool</font> tamano;          <font
      color="#9999ff">/**< ls -S ordena el resultado por tamaño */</font><br>
                <font color="#000099">bool</font> extension;       <font
      color="#9999ff">/**< ls -X ordena por extension */</font><br>
                <font color="#9999ff">// etc.</font><br>
                <br>
                <font color="#000099">void</font> cambia(<font
      color="#000099">int</font> opcion);   /<br>
            }conf;<br>
    <br>
    <br>
    <font color="#000099">void</font> FileManager::conf::cambia(int
    opcion)<br>
    {<br>
            <font color="#000099">if</font> (opcion = MOSTRAR_OCULTOS)<br>
            {<br>
                    <font color="#000099">if</font> ( archOcultos == <font
      color="#000099">false</font>) archOcultos = <font color="#000099">true</font>;<br>
                    <font color="#000099">else</font> archOcultos = <font
      color="#000099">false</font>;<br>
                    <br>
            }<br>
            <font color="#9999ff">// etc.</font><br>
    }<br>
    <br>
    Tras investigar por mi cuenta, mas o menos creo que seria tal que
    así:<br>
    <br>
    <font color="#9999ff">// los #defines de las banderas<br>
    </font><br>
    <font color="#009900">#define MOSTRAR_OCULTOS     0x00000001<br>
      #define INVERTIR_ORDEN         0x00000010<br>
      #define ORDENA_TAMAÑO        0x00000100<br>
      #define ORDENA_EXTENSION   0x00001000</font><br>
    <font color="#9999ff">// etc.</font><br>
    <br>
    <font color="#9999ff">// y pretendo usar las banderas
      miclase::conf::cambia(MOSTRAR_OCULTOS | INVERTIR_ORDEN |  etc...)</font><br>
    <br>
    void FileManager::conf::cambia(Uint32 opcion)<br>
    {<br>
            <font color="#9999ff">// mostrar archivos ocultos</font><br>
            <font color="#000099">if</font> ((opcion >> 0)
    &0xf  == 0x1)<br>
            {<br>
                    <font color="#000099">if</font> ( archOcultos == <font
      color="#000099">false</font>) archOcultos = <font color="#000099">true</font>;<br>
                    <font color="#000099">else</font> archOcultos = <font
      color="#000099">false</font>;<br>
                    <br>
            }<br>
    <br>
            <font color="#9999ff">// invertir el orden de aparición </font><br>
            <font color="#000099">if</font> ((opcion >> 4)
    &0xf == 0x1)<br>
            {<br>
                    <font color="#000099">if</font> ( invertir == <font
      color="#000099">false</font>) invertir = <font color="#000099">true</font>;<br>
                    <font color="#000099">else</font> invertir = <font
      color="#000099">false</font>;<br>
                    <br>
            }<br>
            <font color="#9999ff">// etc.</font><br>
    }<br>
    <br>
    Esto seria correcto?<br>
    ...............................<br>
    <br>
    La otra cuestión es la manera que estoy usando para desplazarme
    entre directorios, aunque me funciona perfectamente con Linux,
    quisiera saber si es una manera correcta de hacer esto y si hay
    alternativas mejores, mi intención es que en un futuro sea multi
    plataforma.<br>
    Lo que hago es:<br>
    <br>
    Capturar en un string el directorio de trabajo actual desde el
    constructor de la case<br>
    <br>
        actual_Dir = getenv("PWD");<br>
    <br>
    Y para capturar el contenido utilizo system() redireccionando la
    salida del comando a un archivo de texto, lo cual no me parece que
    sea lo mas adecuado y donde surge mi duda de si existe alguna forma
    mejor de hacer esto, ademas de que todo cambiaría según el S.O. ...<br>
    <br>
        <font color="#000099">string</font> TmpTXT;<br>
       <font color="#6633ff"> /**< NOTA faltan las opciones de
      configuración que irían justo después de la conf mínima para ls */</font><br>
        TmpTXT = <font color="#000099">"ls --group-directories-first -p
      \"" <font color="#9999ff">/* conf mínima para ls (mostrar primero
        los directoriod, y marcarlos añadiendo un slash '/' ) */</font><br>
                   </font>+ actual_Dir +<font color="#000099"> "\" >
      .tmp/.dirdat.dat";</font><br>
    <br>
        <font color="#000099">if</font> (system(TmpTXT.c_str()) !=0)<br>
        {<br>
            system(<font color="#000099">"mkdir .tmp"</font>);<br>
            system(TmpTXT.c_str());<br>
        }<br>
    <br>
    De forma que solo tengo que leer el archivo .tmp/.dirdat.dat para
    extraer el numero de datos (archivos y directorios) y sus nombres.
    capturandolos en un struct creado dinámicamente, aunque estoy
    creando una lista dinámica sencillita...<br>
    <br>
            <font color="#000099">struct</font> _dato_<br>
            {<br>
                <font color="#33cc00">std</font>::string dato;<font
      color="#9999ff">/**< nombre del archivo o directorio */</font><br>
                <font color="#000099">bool</font> tipodato;<font
      color="#9999ff">/**< si es un directorio = false, si es true es
      un archivo de cualquier tipo */</font><br>
                <font color="#000099">void</font> load(<font
      color="#33cc00">std</font>::string Dato);<br>
            } *dato;<br>
    <br>
    Para moverme por los distintos directorios tan solo modifico el
    string "actual_Dir" eliminando a partir del ultimo separador de
    directorio, o añadiendo el string perteneciente al directorio al que
    quiera descender..<br>
    <br>
    <blockquote><font color="#000099">void</font>
      FileManager::SubirNivel()<br>
      {<br>
      <br>
          actual_Dir.resize (actual_Dir.find_last_of("/"));<font
        color="#9999ff">  /**< de esta forma elimino el ultimo slash,
        y lo que valla a continuación subiendo un nivel */</font><br>
      <br>
          cargar_directorio();  <font color="#9999ff">/**< elimina
        si existe el array de struct _dato_, y crea uno nuevo con la
        info */</font><br>
      <br>
      }<br>
      <br>
      <font color="#000099">void</font> FileManager::BajarNivel(int
      Ndato)<br>
      {<br>
          <font color="#000099">if</font> (dato[Ndato].tipodato == <font
        color="#000099">false</font>) <font color="#9999ff">/**<
        compruebo que sea un directorio */</font><br>
          actual_Dir = actual_Dir+"/"+dato[Ndato].dato;<font
        color="#9999ff"> /**< añado un slash, y el nombre del
        directorio deseado */</font><br>
          cargar_directorio();<br>
      }<br>
    </blockquote>
    <br>
  </body>
</html>