Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Путь к временной директории


Автор: Paranoik 24.7.2006, 02:34
Как скопировать файл во временную директорию, а потом прочитать его оттуда?
Или хотя бы помогите определить путь к ней... 

Автор: Mr.Floppy 24.7.2006, 02:40
Путь к TEMP хранится в реестре, HKEY_CURRENT_USER\Environment\TEMP
О том, как читать из реестра и копировать файлы, ты найдешь в поиске. 

Автор: Bose 24.7.2006, 02:49
Её кстати не обязательно знать. Можно воспользоваться переменной окружения %temp%. 
Как пример попробуй в командной строке набрать:

dir %temp%

и ты увидишь список файлов из Temp каталога. smile  

Автор: Akella 24.7.2006, 08:36
Код

type
  TSystemPath=(Desktop, StartMenu, Programs, ProgramFiles, Startup, Personal, winroot, winsys, WinTemp);
  TfmMain = class(TForm)
...

public
  Function  GetSystemPath(SystemPath:TSystemPath):string;

...



implementation


Function TfmMain.GetSystemPath(SystemPath:TSystemPath):string;
 var
 p:pchar;
 Buffer: array[0..1023] of Char;
begin
 with TRegistry.Create do
   try
     RootKey := HKEY_CURRENT_USER;
     OpenKey('\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', True);
     case SystemPath of
        Desktop : Result := ReadString('Desktop');
      StartMenu : Result := ReadString('Start Menu');
       Programs : Result := ReadString('ProgramFiles');
        Startup : Result := ReadString('Startup');
       Personal : Result := ReadString('Personal');
        WinTemp : SetString(Result, Buffer, GetTempPath(Sizeof(Buffer)-1,Buffer));
        Winroot : begin
                   GetMem(p,255);
                   GetWindowsDirectory(p,254);
                   result:=Strpas(p);
                   Freemem(p);
                  end;//winroot
         WinSys : begin
                   GetMem(p,255);
                   GetSystemDirectory(p,254);
                   result:=Strpas(p);
                   Freemem(p);
                  end;//winsys
    ProgramFiles: begin
                  CloseKey;
                  RootKey := HKEY_LOCAL_MACHINE;
                  OpenKey('\Software\Microsoft\Windows\CurrentVersion', FALSE);
                  Result:=ReadString('ProgramFilesDir');
                  if Result = '' then Result:='C:\Program Files\';
                  end;
     end;//case
   finally
     result := IncludeTrailingPathDelimiter(result);
     CloseKey;
     free;
   end;//try-finally

end;


 

Автор: Yanis 24.7.2006, 09:09
Данный код выведет сообщение с месторасположением папки Temp текущего пользователя:
Код
ShowMessage(GetEnvironmentVariable('Temp'));


Добавлено @ 09:17 
Путь к системной папке Temp по умолчанию равен %SystemRoot%\TEMP. Прочитать его значение можно из реестра:
Код
const
  REG_SYSTEM_TEMP = '\SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
var
  r: TRegistry;
begin
  r := TRegistry.Create(KEY_READ);
  with r do
    begin
      try
        RootKey := HKEY_LOCAL_MACHINE;
        OpenKey(REG_SYSTEM_TEMP, False);
        ShowMessage(ReadString('TEMP'));
      finally
        FreeAndNil(r);
      end;
    end;
end;
 

Автор: Akella 24.7.2006, 09:50
Цитата(Paranoik @  24.7.2006,  02:34 Найти цитируемый пост)
Как скопировать файл во временную директорию, а потом прочитать его оттуда?

Код

Var
 StringList2,StringList:TStringList;
begin
  StringList   := TStringList.create;
  StringList2 := TStringList.create;

StringList.Add('новая строка');
StringList.SaveToFile(GetSystemPath(WinTemp)+'MyFile.tmp');

...
StringList2.LoadFomFile(GetSystemPath(WinTemp)+'MyFile.tmp');

FreeAndNil(StringList);
FreeAndNil(StringList2);
 

Автор: kostas 24.7.2006, 10:33
Кажется в делфи (по крайней мере 7) есть встроенные средства для создания временных файлов и поиска директрии Temp. Находятся в модуле Windows. 

Автор: Yanis 24.7.2006, 18:55
Цитата(kostas @  24.7.2006,  11:33 Найти цитируемый пост)
Кажется в делфи (по крайней мере 7) есть встроенные средства для создания временных файлов и поиска директрии Temp

Эти средства встроены в ОС, а не в Delphi. В Delphi только заголовки. 

Автор: kostas 24.7.2006, 20:09
Сути не меняет smile я просто сам не пользовался, а где то видел, поэтому и сказал так. 

Автор: denks 24.7.2006, 22:26
Вот определение пути к TEMP
Код

function StrPas(const Str: PChar): string;
begin
Result := Str;
end;

function GetTempDir: string;
var
Buffer: array[0..MAX_PATH] of Char;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
Result := StrPas(Buffer);
end;


Функция GetTempDir непосредственно возвращает путь к директории TEMP 

Автор: iskatel2 25.12.2008, 19:21
При компиляции данного кода в Delphi 2009 вер.12.0 столкнулся со следующей проблемой при определении пути системного темпа ../windows/temp
а именно после верного нахождения пути к системному темпу (в переменную st) программа самозавершается с ошибкой "Project gettemp.exe faulted with message: 'access violation at 0x00000000: read of address 0x00000000'. Process stoped. Use Step or Run to continue.".
в более ранней версии Delphi 2005 вер.9.0 с немного измененным кодом (Buffer: array[0..1023] of Char;) программа работает корректно.

Может быть кто то объяснит в чем причина и как с этим бороться?

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Buffer: array[0..1023] of WideChar;
  st:string;
begin
  try
    SetString(st, Buffer, GetTempPath(Sizeof(Buffer)-1,Buffer));
  except
  end;
    ShowMessage(st);
end;


Автор: Akella 25.12.2008, 19:51
мда, этот код тоже

Код

procedure TForm6.Button1Click(Sender: TObject);
var
  Buffer: array[0..MAX_PATH] of Char;
  st:string;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
ShowMessage(StrPas(Buffer));
end;


Автор: CodeMonkey 25.12.2008, 21:43
Код
procedure TForm1.FormCreate(Sender: TObject);
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  GetTempPath((SizeOf(Buffer) div SizeOf(Char)) - 1, Buffer);
  Caption := Buffer;
end;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)