Создать временный файл в системе C, MS Windows

По сути, у меня есть программа, которой дан сжатый файл размером 4 мегабайта, она должна декодировать этот файл в несжатый ~ 100 мегабайт, а затем сжать его обратно в файл ~ 4 мегабайта. Мне нужно сохранить этот промежуточный 100-мегабайтный файл где-то на диске (не хочу держать его в памяти).

Программа написана на C и будет выполняться на MS Windows 7. На момент распаковки программе не предоставляется гарантированная папка (с доступом на запись) (папка с исходным файлом может быть доступна только для чтения, а папка с целевым файлом может быть еще не указано).

Это оказалось непростой задачей:

1) Я читал о функции C, которая создает временный файл, который исчезает при закрытии или завершении программы. Однако, насколько я понимаю, он пытается создать файл на диске C в корневом каталоге, так что это явно не удастся, если у пользователя нет на это прав (чего нет у обычного пользователя)

2) У меня была идея использовать среду /системную переменную TEMP и создайте там файл, НО глядя на случайный ПК с Win7, который не был настроен, я вижу, что эта переменная указывает на c:/windows/temp, и эта папка имеет определенные права для «пользователей» - то есть они иметь права на чтение, выполнение, создание и запись файлов, но не на их удаление, проверку их атрибутов и т.д.Это означает, я предполагаю, что если программа запускается с правами пользователя, она сможет создать файл, но не сможет его удалить, поэтому единственный способ «удалить» это открыть файл для записи, а затем закрыть это, что делает его файлом нулевой длины. Это также нежелательно, и я не знаю, как запрашивать системные переменные из C

3) Итак, в основном, единственная идея, которая у меня есть прямо сейчас, состоит в том, чтобы сделать функцию для открытия файла, которая:

  • пытается создать временный файл в выходном каталоге, если возможно
  • в случае неудачи пытается создать временный файл во входном каталоге
  • в случае неудачи пытается создать временный файл в каталоге TEMP из системной переменной
  • в случае неудачи пытается создать временный файл в каталоге TMP из системной переменной

и функцию удаления, которая:

  • пытается удалить() файл (по его имени, которое где-то хранится)
  • в случае неудачи пытается открыть файл для записи и закройте его, чтобы он стал файлом размером 0 байт.

Есть ли идеи получше?

Спасибо за любую помощь!

PS: Программа не должна использовать какие-либо внешние библиотеки, такие как MFC или что-то подобное, только встроенные стандартные функции C

6
задан Istrebitel 15 March 2012 в 09:46
поделиться