PDA

Ver la Versión Completa : ¿Cómo localizar un directorio que cumpla ciertas características?


strelok
11-08-2021, 12:19:25
Buenos días,

Mi idea es hacer una función de Delphi que sea capaz de detectar si existe o no un directorio (y en caso de que exista, debe devolver el nombre del mismo) que se ubique en C:\ y cumpla las siguientes características.

1. [A-Za-z] - [0-9]-> O sea, un nombre cualquiera (mayus o min) seguido de un guion medio y terminando por un número.

Imaginemos que en el disco C:\ se encuentran los siguientes directorios:
1- Archivos de programa
2- Archivos de programa (x86)
3- Borland
4- Windows
5- Usuarios
6- Pepe - 210909999

Esta función debería retornar "Pepe - 210909999". ¿Cómo puedo hacer esto en Delphi 10.3?

oscorm
11-08-2021, 13:26:18
function TForm1.ListaDirectorios(directorioPadre: string) : TStringList;
var
sr: TSearchRec;
begin
Result := TStringList.Create;
if FindFirst(directorioPadre + '*', faDirectory, sr) = 0 then
repeat
if (sr.Attr = faDirectory) then
Result.Add(directorioPadre + sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
end;

function TForm1.ListaArchivos(directorioPadre: string) : TStringList;
var
sr: TSearchRec;
begin
Result := TStringList.Create;
if FindFirst(directorioPadre + '*', faAnyFile, sr) = 0 then
repeat
if (sr.Attr and faDirectory = 0) or (sr.Name <> '.')
and (sr.Name <> '..') then
Result.Add(directorioPadre + sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
end;


// Llamando a las funciones anteriores
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items := ListaDirectorios('C:\');
ListBox2.Items := ListaArchivos('C:\');
end;

Neftali [Germán.Estévez]
11-08-2021, 13:44:48
Por favor, utilizad TAG's cuando añadáis código Delphi (http://tinyurl.com/bvzsyhb) a los mensajes.

Neftali [Germán.Estévez]
11-08-2021, 13:55:57
Mi idea es hacer una función de Delphi que sea capaz de detectar si existe o no un directorio (y en caso de que exista, debe devolver el nombre del mismo) que se ubique en C:\ y cumpla las siguientes características.

1. [A-Za-z] - [0-9]-> O sea, un nombre cualquiera (mayus o min) seguido de un guion medio y terminando por un número.


Para obtener la lista de directorios que hay "colgando" de uno, puedes usar alguna de las funciones que te ha pasado [oscorm], o también alguna que hay en la sección de trucos del club (https://www.clubdelphi.com/foros/forumdisplay.php?f=52) (por ejemplo este de David (https://www.clubdelphi.com/foros/showthread.php?p=444175#post444175)).

Para conseguir los que cumplen la condición que necesitas, puedes usar expresiones regulares. La idea es para cada uno de los que obtienes en la lista (todos) ver si el nombre se ajusta a una expresión reguular ([A-Za-z] - [0-9]).

Las expresiones regulares se implementan en la unit/clase (System.RegularExpressions.TRegEx). Aquí tienes la documentación (http://docwiki.embarcadero.com/Libraries/Sydney/en/System.RegularExpressions.TRegEx).
En la docwiki también puedes encontrar este ejemplo (http://docwiki.embarcadero.com/CodeExamples/Sydney/en/RTL.RegExpressionVCL_Sample) (que puedes descargar del repositorio de embarcadaero) para utilizar expresiones regulares.

Y si quieres empezar a probar con expresiones regulares, puedes revisar estos links:
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Regular_Expressions
https://stackoverflow.com/questions/27535200/creating-a-regular-expression-in-delphi-using-tregex
https://www.finalbuilder.com/resources/blogs/getting-started-with-delphi-xes-regular-expressions