Determinando la ubicación del directorio de Windows, del directorio de Sistema (System), de los Archivos de programa y del directorio temporal

Obteniendo los directorios importantes de Windows

Copyright © 2000 Ernesto De Spirito

JfControls Library - para Delphi y C++ Builder

Introducción

Muchos creen que el directorio de Windows es C:\WINDOWS, que el directorio System es C:\WINDOWS\SYSTEM, que el directorio temporal es C:\WINDOWS\TEMP y que el directorio de los archivos de programa es C:\ARCHIVOS DE PROGRAMA. Bien, el hecho es que esto no siempre es verdad. Por ejemplo, el directorio temporal es determinado habitualmente por variables de entorno, y en las instalaciones en inglés el directorio de los archivos de programa predeterminado es C:\PROGRAM FILES.

Aquí presentamos un conjunto de funciones para obtener la ubicación real de estos directorios importantes. Estas funciones necesitan las unidades Windows y SysUtils. Todas generan una excepción si fallan.

El directorio de Windows

uses SysUtils, Windows;

function GetWindowsDir: TFileName;
var
  WinDir: array [0..MAX_PATH-1] of char;
begin
  SetString(Result, WinDir, GetWindowsDirectory(WinDir, MAX_PATH));
  if Result = '' then
    raise Exception.Create(SysErrorMessage(GetLastError));
end;

El directorio de los archivos de sistema

function GetSystemDir: TFileName;
var
  SysDir: array [0..MAX_PATH-1] of char;
begin
  SetString(Result, SysDir, GetSystemDirectory(SysDir, MAX_PATH));
  if Result = '' then
    raise Exception.Create(SysErrorMessage(GetLastError));
end;

El directorio de los archivos de programa

function GetProgramFilesDir: TFileName;
begin
  Result := GetRegistryData(HKEY_LOCAL_MACHINE,
    '\Software\Microsoft\Windows\CurrentVersion',
    'ProgramFilesDir');  // o 'ProgramFilesPath'
end;

El directorio temporal

Este es el directorio donde las aplicaciones guardan archivos temporales. No debería usar para este propósito el directorio donde se encuentra su aplicación por dos razones: 1) Usar un directorio temporal común facilita a los usuarios el proceso de limpieza cuando quieren recuperar espacio no usado en el disco duro, y 2) En Windows NT el usuario (y consiguientemente también su aplicación) puede que no tenga suficientes permisos para crear archivos en el directorio donde está instalada la aplicación.

La siguiente función devuelve la ubicación del directorio temporal, e intenta crearlo si no existe.

function GetTempDir: TFileName;
var
  TmpDir: array [0..MAX_PATH-1] of char;
begin
  try
    SetString(Result, TmpDir, GetTempPath(MAX_PATH, TmpDir));
    if not DirectoryExists(Result) then
      if not CreateDirectory(PChar(Result), nil) then begin
        Result := IncludeTrailingBackslash(GetWindowsDir) + 'TEMP';
        if not DirectoryExists(Result) then
          if not CreateDirectory(Pointer(Result), nil) then begin
            Result := ExtractFileDrive(Result) + '\TEMP';
            if not DirectoryExists(Result) then
              if not CreateDirectory(Pointer(Result), nil) then begin
                Result := ExtractFileDrive(Result) + '\TMP';
                if not DirectoryExists(Result) then
                  if not CreateDirectory(Pointer(Result), nil) then begin
                    raise Exception.Create(SysErrorMessage(GetLastError));
                  end;
              end;
          end;
      end;
  except
    Result := '';
    raise;
  end;
end;
Boletín Pascal. Newsletter gratuito para programadores Delphi (y Kylix) con artículos, noticias, trucos, componentes y enlaces a nuevo contenido Delphi en la red.