PDA

Ver la Versión Completa : Carpeta o Unidad de disco??


triskel
08-08-2005, 22:53:33
Hola,

Tengo un string, que es una ruta y necesito saber si esa ruta es una carpeta o una unidad de disco.
Si uso DirectoryExist me devuelve TRUE tanto para 'C:\Test' como para 'C:\'.
¿Alguna idea de como hacerlo?

Gracias por la ayuda

TrisKel

dec
09-08-2005, 01:10:04
Hola,

No sé si se me escapará algo, es muy problable, pero, a ver qué tal parece esto:


// Indica si una ruta es solo una unidad o no.
// Ej. C:\ resultaría True, C:\Windows\ False.
//
function RutaEsSoloUnidad(ruta: string): boolean;
resourcestring
rsErrorNoDir = 'El directorio especificado no existe';
var
unidad, resto: string;
begin
Result := true; // Por defecto
// Extraemos la unidad de la ruta
unidad := ExtractFileDrive(ruta);
// Obtenemos el resto de la ruta
resto := AnsiReplaceStr(ruta, unidad, '');
if (resto <> '\') and (resto <> '')
and DirectoryExists(unidad + resto) then
Result := false; // No es solo la unidad
// ¿Pero existe el directorio en la ruta?
if not DirectoryExists(unidad + resto) then
raise EInOutError.Create(rsErrorNoDir);
end;

// Ejemplo de llamada a la función
//
procedure TForm1.Button1Click(Sender: TObject);
begin
if RutaEsSoloUnidad('C:\') then
ShowMessage('Es solo una unidad')
else ShowMessage('Es otro camino');
end;

roman
09-08-2005, 06:21:35
¿Qué tal algo así?


function IsDrive(S: String): Boolean;
begin
Result := IncludeTrailingPathDelimiter(ExtractFileDrive(S)) = S;
end;


IsDrive no detecta si la ruta especificada por S realmente existe, simplemente determina si es de la forma X:\

EDITO

Otra opción


uses
Masks;

function IsDrive(S: String): Boolean;
begin
Result :=MatchesMask(S, '[a-z]:\');
end;


// Saludos

triskel
09-08-2005, 10:58:20
Gracias por la ayuda, me fue muy util!!

dec
09-08-2005, 15:11:56
Hola,


¿Qué tal algo así?

¡Mucho mejor, dónde va a parar! ;)

dec
15-09-2005, 17:19:27
Hola,

Me permito añadir una línea a una de las funciones escritas por roman más arriba, de tal modo que quede como sigue:


uses
Masks;

function IsDrive(S: String): Boolean;
begin
S := IncludeTrailingPathDelimiter(S);
Result := MatchesMask(S, '[a-z]:\');
end;

De ese modo la función devolverá "True" tanto si se pasa como parámetro "C:\" como si se pasa "C:", por ejemplo. ;)