PDA

Ver la Versión Completa : Como saber la ubicacion de la carpeta Windows


JoAnCa
29-07-2008, 19:51:31
Hola a todos

A lo que me refiero es a como copiar un archivo temporal, en la carpeta Windows\Temp\.
El hecho es que no siempre se instala en C:\ (aunque es lo mas comun), pues si se tienen dos SO instalados estaria en otra particion, o tambien si se hizo otra instalacion encima de las misma, tendria otro nombre (ejem.: Windows.000).

El objetivo es que cuando se ejecute mi aplicacion y quiera copiar en Windows\Temp\ siempre la encuentre y no me de error.


Me parece que este hilo deberia estar en Windows, pero me di cuenta despues que lo hice, disculpenme los Moderadores

Khronos
29-07-2008, 21:11:32
Hola,


function GetWindowsTempFolder : String;
var
pcSystemDirectory : PChar;
dwSDSize : DWORD;
begin
dwSDSize := MAX_PATH + 1;
GetMem( pcSystemDirectory, dwSDSize );
try
if GetSystemDirectory( pcSystemDirectory, dwSDSize ) <> 0 then
Result := pcSystemDirectory + '\temp\';
finally
FreeMem( pcSystemDirectory );
end;
end;

Neftali [Germán.Estévez]
30-07-2008, 09:37:06
También puedes probar con la API GetTempPath.

Po nun botón en un formulario y asignale este código:


procedure TForm1.Button1Click(Sender: TObject);
var
Buffer: array[0..MAX_PATH] of Char;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
Self.Caption := StrPas(Buffer);
end;

FENIXadr
10-12-2010, 17:23:18
Hay otra manera de conocer las carpetas de windows sabiendo su respectiva constante :

CSIDL_DESKTOP for WINDOWS\Desktop
CSIDL_DESKTOPDIRECTORY for WINDOWS\Desktop
CSIDL_FONTS for WINDOWS\FONTS
etc...
etc...

Que al fin y al cabo son del tipo Integer, sabiendo esto, el paso a seguir obvio era hacer un loop cambiendo este entero sin importar como lo llamaron desde mocosoft...

Lo único que necesitamos es un Form con un TMemo y el siguiente código...



uses shlobj, ActiveX;

function GetSystemPath(Folder: Integer): string;
var
PIDL: PItemIDList;
Path: LPSTR;
AMalloc: IMalloc;
begin
Path := StrAlloc(MAX_PATH);
SHGetSpecialFolderLocation(Application.Handle, Folder, PIDL);
if SHGetPathFromIDList(PIDL, Path) then
Result := Path
else
Result := '';
SHGetMalloc(AMalloc);
AMalloc.Free(PIDL);
StrDispose(Path);
end;



procedure TForm1.FormCreate(Sender: TObject);
var a : Integer;
begin
Memo1.Clear;
for a := 0 to 59 do
Memo1.Lines.Add(IntToStr (a) + #9 + GetSystemPath(a))
end;



y listo... descartamos los valores repetidos y le ponemos el nombre que queremos a las constantes que nos interesan...

espero que esto les sea de utilidad, si se puede comenten...