Как создать путь к временному файлу в Windows XP/Vista

Как лучше всего это сделать? tmpnam() возвращает путь к файлу в корне диска, что требует прав администратора в Windows Vista, так что это не вариант.


person Viktor    schedule 18.09.2008    source источник


Ответы (5)


GetTempPath и GetTempFileName должен работать.

person Timbo    schedule 18.09.2008

Переменная среды %TEMP% в Windows указывает на временный каталог пользователя.

В управляемом С++ вы можете вызвать Path::GetTempFileName(), который даст вам временный файл во временном каталоге пользователя (который можно найти с помощью Path::GetTempPath() ). GetTempFileName() в основном просто дает вам путь к файлу в пути %TEMP%, используя GUID в качестве имени файла. Затем вы используете этот путь для создания файла и делаете с ним то, что хотите. Вы можете сделать аналогичную логику на любом языке, который имеет доступ к текущим переменным среды процессов.

Надеюсь, это поможет,

Мартин.

person Martin Woodward    schedule 18.09.2008

Вы пробовали с переменными среды TEMP и TMP, установленными в каталог, доступный для записи всем? Чтобы изменить переменные среды в XP (не знакомы с Vista), перейдите в Свойства системы, вкладку [Дополнительно], кнопку [Переменные среды].

person tzot    schedule 18.09.2008

Возможно, вы могли бы использовать метод Win32 GetTempPath() в kernel32.dll. Это обернуто в .NET с помощью System.IO.Path.GetTempFileName().

В XP это возвращает путь в C:\Documents and Settings\username\Local Settings\Temp\, поэтому вам не нужны права администратора.

person Matt Howells    schedule 18.09.2008

Если вы заботитесь о совместимости, справочная страница для tmpnam предлагает:

справочная страница tmpnam

BUGS
       Never use this function. Use mkstemp(3) instead.

справочная страница mkstemp

SYNOPSIS
       #include <stdlib.h>

       int mkstemp(char *template);

DESCRIPTION
       The mkstemp() function generates a unique temporary file name from template.  The last six characters of template must be
       XXXXXX and these are replaced with a string that makes the filename unique. The file is then created with mode read/write

но все это предполагает, что вы подготовили свой шаблон с префиксом содержимого переменной среды TMP.

person tzot    schedule 18.09.2008
comment
Функция tmpnam доступна для разных платформ и страдает от состояния гонки, поскольку справочная страница, на которую вы ссылаетесь, указывает (kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html) Однако решение, которое справочная страница (и впоследствии вы) предложили НЕ доступно в Windows, о чем исходный вопрос. mktemp доступен, но имеет аналогичную ошибку состояния гонки (а также предсказуемый шаблон файла) msdn.microsoft.com/en-us/library/ms235413(v=vs.80).aspx. - person Zach Burlingame; 19.05.2011
comment
Похоже, что предпочтительным решением в Windows является использование расширенной функции безопасности CRT _mktemp_s, которая недоступна на другой платформе, или использование вызова Windows API GetTempFileName, как указано в принятом ответе. В итоге я не думаю, что для этого существует кроссплатформенный вариант без ошибок. - person Zach Burlingame; 19.05.2011