fcloseを使ってみる。
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <io.h> #include <fcntl.h> #include <share.h> char *make_tempfile(void *data, int len) { char *filnam; int fd; char tmpdirnam[_MAX_PATH]; char tmpfilnam[_MAX_PATH]; int namlen; memset(tmpdirnam, 0, _MAX_PATH); if (GetTempPathA(_MAX_PATH, tmpdirnam) == 0) { return NULL; } memset(tmpfilnam, 0, _MAX_PATH); if (GetTempFileNameA(tmpdirnam, "kks", 0, tmpfilnam) == 0) { return NULL; } namlen = strlen(tmpfilnam) + 1; if ((filnam = calloc(namlen, sizeof(char))) == NULL) { return NULL; } if (strcpy_s(filnam, namlen, tmpfilnam) != 0) { free(filnam); return NULL; } if (data) { if ((_sopen_s(&fd, filnam, _O_WRONLY | _O_BINARY, _SH_DENYRD, _S_IWRITE)) != 0) { free(filnam); return NULL; } if (_write(fd, data, len) == -1) { free(filnam); return NULL; } if (_close(fd) == -1) { free(filnam); return NULL; } } return filnam; } void check_exist(char *filename) { struct stat st; if (stat(filename, &st) == 0) { puts("ファイルはあるよ"); } else { puts("ファイルはないよ"); } } int main() { char *tempfile; HANDLE h; int fd; FILE *f; tempfile = make_tempfile(NULL, 0); printf("filename: %s\n", tempfile); h = CreateFileA(tempfile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL); if (h == INVALID_HANDLE_VALUE) { fprintf(stderr, "CreateFile(): %ld\n", GetLastError()); exit(1); } fd = _open_osfhandle((intptr_t) h, O_RDONLY | O_BINARY); f = _fdopen(fd, "rb"); check_exist(tempfile); fclose(f); check_exist(tempfile); return 0; }
filename: C:\DOCUME~1\sugawara\LOCALS~1\Temp\kks65.tmp
ファイルはあるよ
ファイルはないよ
続行するには何かキーを押してください . . .