Временные файлы
Программы MS-DOS иногда создают на диске временные файлы , задавая для них либо фиксированное имя, которое зависит от программы, либо имя, созданное на основе текущей даты и времени.
Первый способ непригоден для приложений Windows, так как в системе могут работать несколько копий одного приложения. Поэтому, если, например, две копии приложения SUPERCAD попытаются создать два временных файла с именем !suprcad.tmp, такая операция получится только у той копии приложения, которая попытается сделать это первой.
В составе программного интерфейса Windows имеется функция GetTempFileName , предназначенная для получения имени временного файла:
int WINAPI GetTempFileName( BYTE bDriveLetter, LPCSTR lpszPrefixString, UINT uUnique, LPSTR lpszTempFileName);
Параметр bDriveLetter задает диск, на котором будет расположен временный файл. Если значение этого параметра равно нулю, временный файл будет создан на текущем диске.
Параметр lpszPrefixString должен содержать указатель на текстовую строку, содержащую префикс, который будет добавлен к имени временного файла. В префиксе необходимо использовать кодировку OEM.
Параметр uUnique должен содержать целое число, которое будет добавлено к префиксу для формирование имени временного файла. Если значение этого параметра равно нулю, Windows будет использовать число, полученное из текущего системного времени.
Подготовленный полный путь для временного файла будет записан в буфер размером не менее 144 байт, адрес которого передается функции через параметр lpszTempFileName. При этом будет использована кодировка OEM.
Функция GetTempFileName возвращает значение, переданное ей через параметр uUnique, или значение, вычисленное исходя из текущего системного времени, если значение параметра uUnique равно нулю.
Учтите, что функция GetTempFileName не создает временные файлы. За создание и удаление временных файлов отвечает само приложение.
Остановимся подробнее на выборе диска для создания временных файлов.
Приложение Windows должно разрешать пользователю назначить каталог, в котором будут расположены временный файлы.
В этом случае пользователь может отвести для всех временных файлов отдельный логический или даже физический диск, что благоприятно скажется на производительности файловой системы.
Для назначения каталога в простейшем случае можно использовать переменную среды TEMP, устанавливаемую в файле autoexec.bat.
Если передать функции GetTempFileName в качестве параметра bDriveLetter нулевое значение, для определения диска, на котором будет расположен временный файл, используется следующий алгоритм.
Если определена переменная среды TEMP, для размещения временного файла используется диск, указанный в этой переменной.
Если переменная TEMP не определена, для размещения временного файла используется первый жесткий диск, обычно C:.
Вы можете в параметре bDriveLetter указать дополнительно константу TF_FORCEDRIVE, определенную в файле windows.h как 0x80. В этом случае для размещения файлов используется указанный в этом параметре диск без учета переменной среды TEMP или буквы, которой обозначается первый установленный в системе жесткий диск.
В программном интерфейсе Windows есть еще одна функция, которая может быть использована для создания временных файлов. Это функция GetTempDrive :
BYTE WINAPI GetTempDrive(char unused);
Параметр функции не используется.
Функция GetTempDrive возвращает имя диска, который можно использовать для создания временных файлов. Если в системе есть жесткие диски, функция возвращает букву, соответствующую первому диску (обычно C:). В противном случае возвращается имя текущего диска.
Таким образом, для приложений Windows можно сформулировать еще одно правило.
Для создания временных файлов используйте имена, полученные от функции GetTempFileName. Не используйте фиксированные имена, закодированные внутри приложений, так как в Windows можно запустить несколько копий одного приложения.