一時ファイルを作ってファイル閉じたらすぐ削除

#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;

  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);
  }

  check_exist(tempfile);
  CloseHandle(h);
  check_exist(tempfile);

  return 0;
}


filename: C:\DOCUME~1\sugawara\LOCALS~1\Temp\kks1EC.tmp
ファイルはあるよ
ファイルはないよ
続行するには何かキーを押してください . . .