2015-01-10 3 views
-2

Я создаю небольшую библиотеку в C, только для Windows, чтобы помочь мне, когда я хочу создать приложение. Я столкнулся с проблемой создания временных файлов. Я посмотрел на документации функции GetTempPath, и я увидел, что он использует первые существующие переменные среды в следующем порядке:Является ли каталог Windows местом для временных файлов - функция GetTempPath

  1. Пути, заданный переменной в TMP среды.
  2. Путь, заданный переменной окружения TEMP.
  3. Путь, заданный переменной окружения USERPROFILE.
  4. Каталог Windows.

Вопрос: если по какой-то причине первые три переменные не существуют и функция возвращает каталог Windows C:\Windows\, является ли это папка местом для размещения временных файлов?

Если это не так, почему функция возвращает его?

EDIT: то где я должен помещать временные файлы?

Я не хочу бросать Access Denied Error или Temp Path Not Found Error

+0

Если вы работаете в системе, у которой нет этих переменных окружения, вы работаете в неизвестной среде. Лучшее, что вы можете сделать, это прекратить процесс. Если вы попытаетесь получить доступ к '% SystemRoot% \ Temp' из учетной записи пользователя, не входящей в систему, она все равно потерпит неудачу, и ничего не будет получено. Вы могли бы также выручить как можно раньше. Итак, почему «GetTempPath» возвращает бесполезное местоположение в первую очередь? Совместимость с предыдущими версиями Windows. – IInspectable

+0

@Inspectable Im, использующий 'Windows 8.1', также случилось со мной, что функция возвращает каталог Windows, когда я запускаю свою программу с помощью Cygwin Terminal. Я проверил функцию «GetEnvironmentStrings», все эти переменные не были определены, хотя я установил эту переменную вручную в терминале. поэтому я спросил, что мне делать – Ameen

+1

Решение прост: не запускайте приложение с терминала Cygwin. Кроме того, рассмотрите вопрос об отправке отчета об ошибке в команде Cygwin. Мое предложение прекратить ваш процесс, если вы запустите внутри неожиданной среды, остается в силе. – IInspectable

ответ

2

C: \ Windows \, ​​этот каталог место для размещения временных файлов?

Определенно это не так. (Предполагается, что C:\Windows\ - это каталог Windows, возвращаемый GetWindowsDirectory()).

Также при любой недавней установке Windows обычные пользователи даже не смогут ничего записать в каталог Windows (например, C:\Windows\).

Если ни один из указанных выше трех env/var/s не установлен, ваше приложение создает свой собственный каталог для временных файлов, который обычно находится где-то в домашнем каталоге пользователя.

Если ваше приложение исследует это во время установки, оно может рассмотреть установку TMP или TEMP в разумную директорию и создание последней.

+0

Да, есть подсказки API-интерфейсов оболочки, чтобы узнать, где их разместить. –

+1

Возможно, это возвращается в крайнем случае, потому что ОС * уверен *, что существует такая папка. Следует ли использовать «GetWindowsDirectory» и сравнивать возвращаемый путь с этим? – usr2564301

+0

@alk, если я всегда создаю путь самостоятельно: 'SHGetKnownFolderPath (FOLDERID_LocalAppData, 0,0, buffer); strcat (buffer," \\ temp \\ ");', это нормально? – Ameen

1

Это сообщение не может ответить на этот вопрос, но он может объяснить, что происходит и как устранить возможные проблемы:


MSDN documentation говорит, что GetTempPath оценивает ряд переменных окружения.

Однако в документации Cygwin говорится, что среда удалена от процесса. Следовательно, процесс Cygwin не будет иметь необходимых переменных среды в его контексте. Окончательно, GetTempPath не может их поймать и по умолчанию используется каталог Windows.

Решение: Существует функция, которая позволит синхронизировать среду вашего процесса с окружающей средой с Windows:

#include <sys/cygwin.h> 
... 
cygwin_internal (CW_SYNC_WINENV); 

Смотрите документацию Cygwin.

Смежные вопросы