_tempnam
, , _wtempnam
, , tmpnam
_wtmpnam
Wygeneruj nazwy, których można użyć do tworzenia plików tymczasowych. Dostępne są bezpieczniejsze wersje niektórych z tych funkcji; zobacz tmpnam_s
, _wtmpnam_s
.
Składnia
char *_tempnam(
const char *dir,
const char *prefix
);
wchar_t *_wtempnam(
const wchar_t *dir,
const wchar_t *prefix
);
char *tmpnam(
char *str
);
wchar_t *_wtmpnam(
wchar_t *str
);
Parametry
prefix
Ciąg, który jest poprzedzony nazwami zwracanych przez _tempnam
element .
dir
Ścieżka używana w nazwie pliku, jeśli nie ma zmiennej środowiskowej TMP lub jeśli TMP nie jest prawidłowym katalogiem.
str
Wskaźnik, który zawiera wygenerowaną nazwę, identyczną z nazwą zwracaną przez funkcję. Jest to wygodny sposób zapisywania wygenerowanej nazwy.
Wartość zwracana
Każda z tych funkcji zwraca wskaźnik do wygenerowanej nazwy lub NULL
jeśli wystąpi błąd. Błąd może wystąpić, jeśli spróbujesz więcej niż TMP_MAX
(zobacz TEMAT STDIO. H) wywołuje metodę tmpnam
lub , jeśli używasz _tempnam
i istnieje nieprawidłowa nazwa katalogu określona w TMP
zmiennej środowiskowej i w parametrze dir
.
Uwaga
Wskaźniki zwracane przez tmpnam
i _wtmpnam
wskazują wewnętrzne statyczne. free
nie należy wywoływać w celu cofnięcia przydziału tych wskaźników. free
należy wywołać dla wskaźników przydzielonych przez _tempnam
i _wtempnam
.
Uwagi
Każda z tych funkcji zwraca nazwę pliku, który obecnie nie istnieje. tmpnam
Zwraca unikatową nazwę w wyznaczonym katalogu tymczasowym systemu Windows zwróconym przez GetTempPathW
polecenie . _tempnam
Generuje unikatową nazwę w katalogu innym niż wyznaczony. Gdy nazwa pliku jest poprzedzana ukośnikiem odwrotnym i nie ma informacji o ścieżce, takich jak \fname21
, wskazuje, że nazwa jest prawidłowa dla bieżącego katalogu roboczego.
W przypadku tmpnam
programu można przechowywać tę wygenerowaną nazwę pliku w pliku str
. Jeśli str
wartość to NULL
, tmpnam
spowoduje to pozostawienie wyniku w wewnętrznym buforze statycznym. W związku z tym wszelkie kolejne wywołania zniszczą tę wartość. Nazwa wygenerowana przez tmpnam
program składa się z nazwy pliku wygenerowanego przez program i, po pierwszym wywołaniu metody tmpnam
, rozszerzenie pliku sekwencyjnych numerów w bazie 32 (.1-.vvu, gdy TMP_MAX
w STDIO. H to 32 767).
_tempnam
Generuje unikatową nazwę pliku dla katalogu wybranego przez następujące reguły:
Jeśli zmienna środowiskowa TMP jest zdefiniowana i ustawiona na prawidłową nazwę katalogu, unikatowe nazwy plików są generowane dla katalogu określonego przez protokół TMP.
Jeśli zmienna środowiskowa TMP nie jest zdefiniowana lub jeśli jest ustawiona na nazwę katalogu, który nie istnieje, użyj parametru
dir
jako ścieżki,_tempnam
dla której generuje unikatowe nazwy.Jeśli zmienna środowiskowa TMP nie jest zdefiniowana lub jeśli jest ustawiona na nazwę katalogu, który nie istnieje, a jeśli
dir
jestNULL
albo ustawiona na nazwę katalogu, który nie istnieje,_tempnam
użyj bieżącego katalogu roboczego, aby wygenerować unikatowe nazwy. Obecnie, jeśli zarówno TMP, jak idir
określ nazwy katalogów, które nie istnieją, wywołanie funkcji _tempnam zakończy się niepowodzeniem.
Nazwa zwracana przez _tempnam
element jest łączeniem prefix
i sekwencyjną liczbą, która łączy się w celu utworzenia unikatowej nazwy pliku dla określonego katalogu. _tempnam
Generuje nazwy plików, które nie mają rozszerzenia. _tempnam
używa malloc
do przydzielenia miejsca dla nazwy pliku; program jest odpowiedzialny za zwalnianie tego miejsca, gdy nie jest już potrzebne.
_tempnam
i tmpnam
automatycznie obsługują odpowiednio argumenty ciągu wielobajtowego, rozpoznając sekwencje znaków wielobajtowych zgodnie ze stroną kodową producenta OEM uzyskaną z systemu operacyjnego. _wtempnam
jest wersją szerokoznakową ; _tempnam
argumenty i wartość zwracana _wtempnam
są ciągami o szerokim znaku. _wtempnam
i _tempnam
zachowują się identycznie, z tą różnicą, że _wtempnam
nie obsługuje ciągów wielobajtowych znaków. _wtmpnam
jest wersją szerokoznakową ; tmpnam
argument i wartość zwracana _wtmpnam
są ciągami o szerokim znaku. _wtmpnam
i tmpnam
zachowują się identycznie, z tą różnicą, że _wtmpnam
nie obsługuje ciągów wielobajtowych znaków.
Jeśli _DEBUG
i _CRTDBG_MAP_ALLOC
są zdefiniowane, _tempnam
i _wtempnam
są zastępowane przez wywołania do _tempnam_dbg
i _wtempnam_dbg
.
Mapowania procedur tekstu ogólnego
Procedura TCHAR.H | _UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_ttmpnam |
tmpnam |
tmpnam |
_wtmpnam |
_ttempnam |
_tempnam |
_tempnam |
_wtempnam |
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_tempnam |
<stdio.h> |
_wtempnam , _wtmpnam |
<stdio.h> lub <wchar.h> |
tmpnam |
<stdio.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// crt_tempnam.c
// compile with: /W3
// This program uses tmpnam to create a unique filename in the
// temporary directory, and _tempname to create a unique filename
// in C:\\tmp.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char * name1 = NULL;
char * name2 = NULL;
char * name3 = NULL;
// Create a temporary filename for the current working directory:
if ((name1 = tmpnam(NULL)) != NULL) { // C4996
// Note: tmpnam is deprecated; consider using tmpnam_s instead
printf("%s is safe to use as a temporary file.\n", name1);
} else {
printf("Cannot create a unique filename\n");
}
// Create a temporary filename in temporary directory with the
// prefix "stq". The actual destination directory may vary
// depending on the state of the TMP environment variable and
// the global variable P_tmpdir.
if ((name2 = _tempnam("c:\\tmp", "stq")) != NULL) {
printf("%s is safe to use as a temporary file.\n", name2);
} else {
printf("Cannot create a unique filename\n");
}
// When name2 is no longer needed:
if (name2) {
free(name2);
}
// Unset TMP environment variable, then create a temporary filename in C:\tmp.
if (_putenv("TMP=") != 0) {
printf("Could not remove TMP environment variable.\n");
}
// With TMP unset, we'll use C:\tmp as the temporary directory.
// Create a temporary filename in C:\tmp with prefix "stq".
if ((name3 = _tempnam("c:\\tmp", "stq")) != NULL) {
printf("%s is safe to use as a temporary file.\n", name3);
}
else {
printf("Cannot create a unique filename\n");
}
// When name3 is no longer needed:
if (name3) {
free(name3);
}
return 0;
}
C:\Users\LocalUser\AppData\Local\Temp\sriw.0 is safe to use as a temporary file.
C:\Users\LocalUser\AppData\Local\Temp\stq2 is safe to use as a temporary file.
c:\tmp\stq3 is safe to use as a temporary file.