Много способов создать временный файл: какова ситуация с каждым методом? - PullRequest
2 голосов
/ 19 октября 2011

Моему приложению C ++ winAPI необходимо создать временный файл перед его загрузкой на сервер.Итак, я искал способы создания временного файла и обнаружил, что есть много способов сделать это.

Можете ли вы сказать мне: Для каждого из следующих методов ниже, в каком сценарии ядолжен использовать этот метод?И какой метод лучше всего подходит для моих нужд?

Метод 1:

// Using CreateFile()
CreateFile( "myfile.txt", GENERIC_ALL, ..., FILE_ATTRIBUTE_TEMPORARY, 0); // removed unecessary parameters

Метод 2:

// I think that GetTempFileName also creates the file doesn't it? Not just generates a unique fileName?
//  Gets the temp path env string (no guarantee it's a valid path).
dwRetVal = GetTempPath(MAX_PATH,          // length of the buffer
                       lpTempPathBuffer); // buffer for path 

//  Generates a temporary file name. 
uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files
                          TEXT("DEMO"),     // temp file name prefix 
                          0,                // create unique name 
                          szTempFileName);  // buffer for name 

Метод 3:

// Create a file & use the flag DELETE_ON_CLOSE. So its a temporary file that will delete when the last HANDLE to it closes
HANDLE h_file = CreateFile( tmpfilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL ); 

Почему существует более 1 способа создания временного файла.И, например, в какой ситуации я хотел бы использовать, скажем, метод 2 вместо метода 1?

Ответы [ 2 ]

5 голосов
/ 19 октября 2011

FILE_ATTRIBUTE_TEMPORARY просто говорит Windows не беспокоиться о записи содержимого файла на диск, если кеша достаточно, потому что файл временный и никакой другой процесс не будет его использовать.

FILE_FLAG_DELETE_ON_CLOSE означает только то, что онговорит - когда вы закрываете файл, он будет удален автоматически.Это гарантирует, что оно будет временным.

GetTempFilename создает имя для временного файла и гарантирует, что имя файла ранее не использовалось.

Вы должны использовать все 3 метода, когдасоздание временного файла.Никто из них не мешает другим.

0 голосов
/ 22 марта 2014

Для метода # 2, если вы используете 0 для «уникального идентификатора», вам действительно нужно вызвать SetFileAttributes с FILE_ATTRIBUTE_TEMPORARY, чтобы сделать сгенерированный файл временным в том же смысле, что и метод # 1 (иначе это будет обычный файл ARCHIVE / NOT_CONTENT_INDEXED .)

Используйте GetFileAttributes или GetFileInformationByHandle, чтобы увидеть, какими атрибутами фактически обладает файл.

...