<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>