La primera opción la imagino así:
Código PHP:
<?php
$rs1 = mysql_query("select * from carpetas order by id_carpeta ASC") or die (mysql_error());
while($row1 = mysql_fetch_assoc($rs1, MYSQL_ASSOC)){
$id_carpeta = $row1['id_carpeta'];
echo "<li>".$row1['nombre_carpeta']."</li>";
//hago consulta consulta para buscar los archivos en raiz
$rs2 = mysql_query("select * from archivos where id_carpeta='$id_carpeta' and id_subcarpeta='0'"); //si es 0 significa que esta en raiz
while($row2 = mysql_fetch_assoc($rs2, MYSQL_ASSOC)){
echo "<li>".$row2['nombre_archivo']."</li>";
}
echo "<ul>";
//hago consulta para listar las subcarpetas
$rs3 = mysql_query("select * from archivos_raiz where id_carpeta='$id_carpeta'");
while($row3 = mysql_fetch_assoc($rs3, MYSQL_ASSOC)){
$id_sub_carpeta = $row1['id_sub_carpeta'];
//buscamos aver si tiene algo XD
$rsBuscar = mysql_query("select * from archivos where id_carpeta='$id_carpeta' and id_subcarpeta='$id_sub_carpeta'");
$total_rsBuscar = mysql_num_rows($rsBuscar);
//si existe continuamos
if($total_rsBuscar>0){
echo "<li>".$row3['nombre_subcarpeta']."</li>";
//hago consulta para listar archivos dentro de las subcarpetas
echo "<ul>";
$rs4 = mysql_query("select * from archivos where id_carpeta='$id_carpeta' and id_subcarpeta='$id_sub_carpeta'");
while($row4 = mysql_fetch_assoc($rs4, MYSQL_ASSOC)){
echo "<li>".$row4['nombre_archivo']."</li>";
}
echo "</ul>";
}//fin del if
}
echo "</ul>";
}
?>