Поделиться через


Функция CreateFileTransactedA (winbase.h)

[Корпорация Майкрософт настоятельно рекомендует разработчикам использовать альтернативные средства для достижения потребностей вашего приложения. Многие сценарии, для которые TxF был разработан, можно достичь с помощью более простых и более доступных методов. Кроме того, TxF может быть недоступна в будущих версиях Microsoft Windows. Дополнительные сведения и альтернативные варианты TxF см. в разделе Альтернативные варианты использования транзакционных NTFS.]

Создает или открывает файл, поток файлов или каталог как транзакцию. Функция возвращает дескриптор, который можно использовать для доступа к объекту.

Чтобы выполнить эту операцию как нетрансактированную операцию или получить доступ к объектам, отличным от файлов (например, именованных каналов, физических устройств, почтовых объектов), используйте функцию createFile .

Дополнительные сведения о транзакциях см. в разделе "Примечания" этого раздела.

Синтаксис

HANDLE CreateFileTransactedA(
  [in]           LPCSTR                lpFileName,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwCreationDisposition,
  [in]           DWORD                 dwFlagsAndAttributes,
  [in, optional] HANDLE                hTemplateFile,
  [in]           HANDLE                hTransaction,
  [in, optional] PUSHORT               pusMiniVersion,
                 PVOID                 lpExtendedParameter
);

Параметры

[in] lpFileName

Имя объекта, который нужно создать или открыть.

Объект должен находиться на локальном компьютере; в противном случае функция завершается ошибкой, а для последнего кода ошибки задано значение ERROR_TRANSACTIONS_UNSUPPORTED_REMOTE.

По умолчанию имя ограничено MAX_PATH символами. Чтобы расширить это ограничение до 32 767 расширенных символов, добавьте "\\?\" в путь. Дополнительные сведения см. в именовании файлов, путей и пространств имен.

Кончик

Начиная с Windows 10 версии 1607, вы можете отказаться от ограничения MAX_PATH без предустановки "\\?\". Дополнительные сведения см. в разделе "Ограничение максимальной длины пути" файлы именования, пути и пространства имен.

Чтобы создать поток файлов, укажите имя файла, двоеточие и имя потока. Дополнительные сведения см. в разделе файловых потоков.

[in] dwDesiredAccess

Доступ к объекту, который можно суммировать как чтение, запись, оба или ни один (ноль). Наиболее часто используются значения GENERIC_READ, GENERIC_WRITEили обоих (GENERIC_READ | GENERIC_WRITE). Дополнительные сведения см. в универсальных прав доступа и права на безопасность файлов и доступ.

Если этот параметр равен нулю, приложение может запрашивать файл, каталог или атрибуты устройства без доступа к этому файлу или устройству. Дополнительные сведения см. в разделе "Примечания" этой статьи.

Невозможно запросить режим доступа, который конфликтует с режимом общего доступа, указанным в открытом запросе, который имеет открытый дескриптор. Дополнительные сведения см. в создании и открытии файлов.

[in] dwShareMode

Режим общего доступа объекта, который может быть считываем, записывать и удалять, все из них или нет (см. следующую таблицу).

Если этот параметр равен нулю и CreateFileTransacted выполнен успешно, объект нельзя открыть повторно, пока не будет закрыт дескриптор. Дополнительные сведения см. в разделе "Примечания" этой статьи.

Невозможно запросить режим общего доступа, который конфликтует с режимом доступа, указанным в открытом запросе с открытым дескриптором, так как это приведет к следующему нарушению общего доступа: ERROR_SHARING_VIOLATION. Дополнительные сведения см. в создании и открытии файлов.

Чтобы включить общий доступ к объекту, а другой процесс открыт, используйте сочетание одного или нескольких следующих значений, чтобы указать режим доступа, который он может запросить, чтобы открыть объект.

Примечание Параметры общего доступа для каждого открытого дескриптора остаются в силе, пока этот дескриптор не будет закрыт, независимо от контекста процесса.
 
Ценность Значение
0
0x00000000
Отключает последующие операции открытия объекта для запроса любого типа доступа к объекту.
FILE_SHARE_DELETE
0x00000004
Позволяет последующим открытым операциям с объектом запрашивать доступ к удалению.

В противном случае другие процессы не могут открыть объект, если они запрашивают доступ к удалению.

Если этот флаг не указан, но объект был открыт для доступа к удалению, функция завершается ошибкой.

FILE_SHARE_READ
0x00000001
Позволяет последующим открытым операциям с объектом запрашивать доступ на чтение.

В противном случае другие процессы не могут открыть объект, если они запрашивают доступ на чтение.

Если этот флаг не указан, но объект был открыт для доступа на чтение, функция завершается ошибкой.

FILE_SHARE_WRITE
0x00000002
Позволяет последующим открытым операциям с объектом запрашивать доступ на запись.

В противном случае другие процессы не могут открыть объект, если они запрашивают доступ на запись.

Если этот флаг не указан, но объект был открыт для доступа на запись или имеет сопоставление файлов с доступом на запись, функция завершается ошибкой.

[in, optional] lpSecurityAttributes

Указатель на структуру SECURITY_ATTRIBUTES, содержащую необязательный дескриптор безопасности, а также определяет, можно ли наследовать возвращенный дескриптор дочерними процессами. Параметр может быть null.

Если параметр lpSecurityAttributes имеет значениеNULL, то дескриптор, возвращаемый CreateFileTransacted, не может наследоваться любым дочерним процессом, который может создать приложение, а объект, связанный с возвращенным дескриптором безопасности, получает дескриптор безопасности по умолчанию.

Элемент bInheritHandle структуры указывает, можно ли наследовать возвращенный дескриптор.

Элемент структуры lpSecurityDescriptor указывает дескриптор безопасности для объекта, но также может быть null.

Если элемент lpSecurityDescriptor NULL, объект, связанный с возвращенным дескриптором безопасности, назначается дескриптор безопасности по умолчанию.

CreateFileTransacted игнорирует элемент lpSecurityDescriptor при открытии существующего файла, но продолжает использовать элемент bInheritHandle.

Дополнительные сведения см. в разделе "Примечания" этой статьи.

[in] dwCreationDisposition

Действие, которое необходимо предпринять для файлов, которые существуют и не существуют.

Дополнительные сведения см. в разделе "Примечания" этой статьи.

Этот параметр должен быть одним из следующих значений, которые нельзя объединить.

Ценность Значение
CREATE_ALWAYS
2
Всегда создает новый файл.

Если указанный файл существует и доступен для записи, функция усечена файла, функция завершается успешно, а код последней ошибки имеет значение ERROR_ALREADY_EXISTS (183).

Если указанный файл не существует и является допустимым путем, создается новый файл, функция завершается успешно, а код последней ошибки равен нулю.

Дополнительные сведения см. в разделе "Примечания" этой статьи.

CREATE_NEW
1
Создает новый файл, только если он еще не существует.

Если указанный файл существует, функция завершается ошибкой, и для последней ошибки задано значение ERROR_FILE_EXISTS (80).

Если указанный файл не существует и является допустимым путем к записываемому расположению, создается новый файл.

OPEN_ALWAYS
4
Открывает файл всегда.

Если указанный файл существует, функция завершается успешно, а код последней ошибки имеет значение ERROR_ALREADY_EXISTS (183).

Если указанный файл не существует и является допустимым путем к записываемому расположению, функция создает файл, а код последней ошибки имеет значение нулю.

OPEN_EXISTING
3
Открывает файл или устройство, только если он существует.

Если указанный файл не существует, функция завершается ошибкой, а для последней ошибки задано значение ERROR_FILE_NOT_FOUND (2).

Дополнительные сведения см. в разделе "Примечания" этой статьи.

TRUNCATE_EXISTING
5
Открывает файл и усечение его таким образом, чтобы его размер был равен нулю байтам, только если он существует.

Если указанный файл не существует, функция завершается ошибкой, а для последней ошибки задано значение ERROR_FILE_NOT_FOUND (2).

Вызывающий процесс должен открыть файл с GENERIC_WRITE битом в рамках параметра dwDesiredAccess.

[in] dwFlagsAndAttributes

Атрибуты и флаги файла, FILE_ATTRIBUTE_NORMAL является наиболее распространенным значением по умолчанию.

Этот параметр может включать любое сочетание доступных атрибутов файла (FILE_ATTRIBUTE_*). Все остальные атрибуты файла переопределяют FILE_ATTRIBUTE_NORMAL.

Этот параметр также может содержать сочетания флагов (FILE_FLAG_) для управления поведением буферизации, режимами доступа и другими флагами специального назначения. Они объединяются с любыми значениями FILE_ATTRIBUTE_.

Этот параметр также может содержать сведения о качестве обслуживания (SQOS), указав флаг SECURITY_SQOS_PRESENT. Дополнительные сведения о флагах, связанных с SQOS, представлены в таблице ниже атрибутов и таблиц флагов.

Примечание   

Когда CreateFileTransacted открывает существующий файл, он обычно объединяет флаги файлов с атрибутами файла существующего файла и игнорирует атрибуты файлов, предоставленные в рамках dwFlagsAndAttributes. Специальные случаи подробно описаны в создании и открытии файлов.

 
Следующие атрибуты и флаги файлов используются только для файловых объектов, а не для других типов объектов, которые открывается CreateFileTransacted (дополнительные сведения можно найти в разделе "Примечания" этого раздела). Дополнительные сведения о более расширенном доступе к атрибутам файла см. в разделе SetFileAttributes. Полный список всех атрибутов файла со своими значениями и описаниями см. в константы атрибутов файлов.
Атрибут Значение
FILE_ATTRIBUTE_ARCHIVE
32 (0x20)
Файл должен быть архивирован. Приложения используют этот атрибут, чтобы пометить файлы для резервного копирования или удаления.
FILE_ATTRIBUTE_ENCRYPTED
16384 (0x4000)
Файл или каталог шифруются. Для файла это означает, что все данные в файле шифруются. Для каталога это означает, что шифрование используется по умолчанию для только что созданных файлов и подкаталогов. Дополнительные сведения см. в шифрования файлов.

Этот флаг не действует, если FILE_ATTRIBUTE_SYSTEM также указан.

FILE_ATTRIBUTE_HIDDEN
2 (0x2)
Файл скрыт. Не включайте его в обычный список каталогов.
FILE_ATTRIBUTE_NORMAL
128 (0x80)
Файл не имеет других атрибутов. Этот атрибут действителен только в том случае, если используется только один.
FILE_ATTRIBUTE_OFFLINE
4096 (0x1000)
Данные файла не сразу доступны. Этот атрибут указывает, что данные файлов физически перемещаются в автономное хранилище. Этот атрибут используется удаленным хранилищем, иерархическим программным обеспечением управления хранилищами. Приложения не должны произвольно изменять этот атрибут.
FILE_ATTRIBUTE_READONLY
1 (0x1)
Файл доступен только для чтения. Приложения могут считывать файл, но не могут записывать в него или удалять его.
FILE_ATTRIBUTE_SYSTEM
4 (0x4)
Файл является частью или используется исключительно операционной системой.
FILE_ATTRIBUTE_TEMPORARY
256 (0x100)
Файл используется для временного хранилища. Файловые системы не записывать данные обратно в массовое хранилище, если доступно достаточное количество памяти кэша, так как приложение удаляет временный файл после закрытия дескриптора. В этом случае система может полностью избежать записи данных. В противном случае данные записываются после закрытия дескриптора.
 
Флаг Значение
FILE_FLAG_BACKUP_SEMANTICS
0x02000000
Файл открывается или создается для операции резервного копирования или восстановления. Система гарантирует, что вызывающий процесс переопределяет проверку безопасности файлов при SE_BACKUP_NAME и привилегиях SE_RESTORE_NAME. Дополнительные сведения см. в разделе Изменение привилегий вмаркера.

Этот флаг необходимо задать для получения дескриптора в каталог. Дескриптор каталога можно передать некоторым функциям вместо дескриптора файлов. Дополнительные сведения см. в разделе Дескрипторы каталогов.

FILE_FLAG_DELETE_ON_CLOSE
0x04000000
Файл должен быть удален сразу после закрытия последнего дескриптора транзакционного модуля записи в файл, если транзакция по-прежнему активна. Если файл помечен для удаления и дескриптор записи транзакций по-прежнему открыт после завершения транзакции, файл не будет удален.

Если в файле есть открытые дескрипторы, вызов завершается ошибкой, если они не были открыты с режимом общего доступа FILE_SHARE_DELETE.

Последующие открытые запросы для файла завершаются ошибкой, если не указан режим общего доступа FILE_SHARE_DELETE.

FILE_FLAG_NO_BUFFERING
0x20000000
Файл открывается без кэширования системы. Этот флаг не влияет на кэширование жесткого диска или сопоставленные с памятью файлы. При сочетании с FILE_FLAG_OVERLAPPEDфлаг обеспечивает максимальную асинхронную производительность, так как операции ввода-вывода не зависят от синхронных операций диспетчера памяти. Однако некоторые операции ввода-вывода занимают больше времени, так как данные не хранятся в кэше. Кроме того, метаданные файла могут кэшироваться. Чтобы очистить метаданные на диск, используйте функцию FlushFileBuffers.

Приложение должно соответствовать определенным требованиям при работе с файлами, открывающимися с помощью FILE_FLAG_NO_BUFFERING:

  • Доступ к файлам должен начинаться с смещения байтов в файле, которые являются целыми числами размера сектора томов.
  • Доступ к файлам должен быть для числа байтов, которые являются целыми числами нескольких размеров сектора тома. Например, если размер сектора составляет 512 байт, приложение может запрашивать чтение и запись 512, 1024, 1536 или 2048 байт, но не 335, 981 или 7171 байт.
  • Буферные адреса для операций чтения и записи должны быть выровнены в секторе, что означает выравнивание по адресам в памяти, которые являются целыми числами размера сектора томов. В зависимости от диска это требование может не применяться.
Один из способов выравнивания буферов по целым числам нескольких размеров сектора томов — использовать VirtualAlloc для выделения буферов. Он выделяет память, выравниваемую по адресам, которые являются целыми числами размера страницы памяти операционной системы. Так как размер страницы памяти и сектора тома имеют значение 2, эта память также выравнивается по адресам, которые имеют целый ряд размеров сектора томов. Страницы памяти размером 4 или 8 КБ; секторы : 512 байт (жесткие диски), 2048 байт (CD) или 4096 байт (жесткие диски), поэтому секторы томов никогда не могут быть больше страниц памяти.

Приложение может определить размер сектора томов, вызвав функцию GetDiskFreeSpace.

FILE_FLAG_OPEN_NO_RECALL
0x00100000
Запрашивается файл, но он должен продолжать находиться в удаленном хранилище. Его не следует передавать обратно в локальное хранилище. Этот флаг предназначен для использования в системах удаленного хранения.
FILE_FLAG_OPEN_REPARSE_POINT
0x00200000
Обычное перепарировать точку не будет выполняться; CreateFileTransacted попытается открыть точку повторного выполнения. При открытии файла возвращается дескриптор файла, независимо от того, работает ли фильтр, который управляет точкой повторного выполнения. Этот флаг нельзя использовать с флагом CREATE_ALWAYS. Если файл не является точкой перепарирования, этот флаг игнорируется.
FILE_FLAG_OVERLAPPED
0x40000000
Файл открывается или создается для асинхронного ввода-вывода. После завершения операции событие, указанное в структуре OVERLAPPED, устанавливается в сигнальное состояние. Операции, которые занимают значительное время для обработки возврата ERROR_IO_PENDING.

Если этот флаг указан, файл можно использовать для одновременных операций чтения и записи. Система не поддерживает указатель на файл, поэтому необходимо передать положение файла функциям чтения и записи в структуре OVERLAPPED или обновить указатель файла.

Если этот флаг не указан, операции ввода-вывода сериализуются, даже если вызовы функций чтения и записи указывают структуру OVERLAPPED.

FILE_FLAG_POSIX_SEMANTICS
0x01000000
Доступ к файлу осуществляется в соответствии с правилами POSIX. Это включает в себя разрешение нескольких файлов с именами, отличающимися только в случае, для файловой системы, поддерживающей это именование. Используйте осторожность при использовании этого параметра, так как файлы, созданные с помощью этого флага, могут быть недоступны приложениями, написанными для MS-DOS или 16-разрядных Windows.
FILE_FLAG_RANDOM_ACCESS
0x10000000
Доступ к файлу осуществляется случайным образом. Система может использовать это в качестве указания для оптимизации кэширования файлов.
FILE_FLAG_SESSION_AWARE
0x00800000
Файл или устройство открывается с помощью осведомленности о сеансе. Если этот флаг не указан, то для каждого сеанса (например, устройства с использованием перенаправления USB RemoteFX) невозможно открыть процессами, выполняемыми в сеансе 0. Этот флаг не действует для вызывающих абонентов в сеансе 0. Этот флаг поддерживается только в выпусках сервера Windows.

Windows Server 2008 R2 и Windows Server 2008: этот флаг не поддерживается до Windows Server 2012.

FILE_FLAG_SEQUENTIAL_SCAN
0x08000000
Доступ к файлу осуществляется последовательно с начала до конца. Система может использовать это в качестве указания для оптимизации кэширования файлов. Если приложение перемещает указатель на файл для случайного доступа, оптимальное кэширование может не произойти. Однако правильная операция по-прежнему гарантируется.

Указание этого флага может повысить производительность приложений, которые считывают большие файлы с помощью последовательного доступа. Повышение производительности может быть еще более заметным для приложений, которые считывают большие файлы в основном последовательно, но иногда пропускают небольшие диапазоны байтов.

Этот флаг не действует, если файловая система не поддерживает кэшированные операции ввода-вывода и FILE_FLAG_NO_BUFFERING.

FILE_FLAG_WRITE_THROUGH
0x80000000
Операции записи не будут проходить через промежуточный кэш, они будут переходить непосредственно на диск.

Если FILE_FLAG_NO_BUFFERING не указано, поэтому кэширование системы действует, данные записываются в системный кэш, но сбрасываются на диск без задержки.

Если FILE_FLAG_NO_BUFFERING также указан, поэтому кэширование системы не действует, данные немедленно сбрасываются на диск без прохождения системного кэша. Операционная система также запрашивает кэш жесткого диска на постоянный носитель. Однако не все оборудование поддерживает эту возможность записи.

 

Параметр dwFlagsAndAttributes также может указывать сведения о качестве обслуживания безопасности. Дополнительные сведения см. в уровнях олицетворения. Когда вызывающее приложение указывает флаг SECURITY_SQOS_PRESENT в составе dwFlagsAndAttributes, он также может содержать одно или несколько следующих значений.

Флаг безопасности Значение
SECURITY_ANONYMOUS
Олицетворение клиента на уровне анонимного олицетворения.
SECURITY_CONTEXT_TRACKING
Режим отслеживания безопасности является динамическим. Если этот флаг не указан, режим отслеживания безопасности является статическим.
SECURITY_DELEGATION
Олицетворение клиента на уровне олицетворения делегирования.
SECURITY_EFFECTIVE_ONLY
Для сервера доступны только включенные аспекты контекста безопасности клиента. Если этот флаг не указан, доступны все аспекты контекста безопасности клиента.

Это позволяет клиенту ограничить группы и привилегии, которые сервер может использовать при олицетворении клиента.

SECURITY_IDENTIFICATION
Олицетворение клиента на уровне олицетворения идентификации.
SECURITY_IMPERSONATION
Олицетворение клиента на уровне олицетворения. Это поведение по умолчанию, если другие флаги не указаны вместе с флагом SECURITY_SQOS_PRESENT.

[in, optional] hTemplateFile

Допустимый дескриптор файла шаблона с правом доступа GENERIC_READ. Файл шаблона предоставляет атрибуты файла и расширенные атрибуты для создаваемого файла. Этот параметр может быть NULL.

При открытии существующего файла CreateFileTransacted игнорирует файл шаблона.

При открытии нового зашифрованного файла EFS файл наследует DACL из родительского каталога.

[in] hTransaction

Дескриптор транзакции. Этот дескриптор возвращается функцией CreateTransaction.

[in, optional] pusMiniVersion

Миниверсия, открываемая. Если транзакция, указанная в hTransaction, не является транзакцией, изменяющей файл, этот параметр должен быть null. В противном случае этот параметр может быть идентификатором миниверсии, возвращаемым кодом элемента управления FSCTL_TXFS_CREATE_MINIVERSION или одним из следующих значений.

Ценность Значение
TXFS_MINIVERSION_COMMITTED_VIEW
0x0000
Представление файла по состоянию на последнюю фиксацию.
TXFS_MINIVERSION_DIRTY_VIEW
0xFFFF
Представление файла, измененного транзакцией.
TXFS_MINIVERSION_DEFAULT_VIEW
0xFFFE
Либо зафиксированное или грязное представление файла, в зависимости от контекста. Транзакция, изменяющая файл, получает грязное представление, а транзакция, которая не изменяет файл, получает зафиксированное представление.

lpExtendedParameter

Этот параметр зарезервирован и должен быть null.

Возвращаемое значение

Если функция выполнена успешно, возвращаемое значение является открытым дескриптором указанного файла, устройства, именованного канала или почтового слота.

Если функция завершается ошибкой, возвращаемое значение INVALID_HANDLE_VALUE. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.

Замечания

При использовании дескриптора, возвращаемого CreateFileTransacted, используйте трансактированную версию функций ввода-вывода файлов вместо стандартных функций ввода-вывода файлов, где это необходимо. Дополнительные сведения см. в разделе Рекомендации по программированию длятранзакционных NTFS.

При открытии транзакционного дескриптора в каталоге необходимо иметь разрешения FILE_WRITE_DATA (FILE_ADD_FILE) и FILE_APPEND_DATA (FILE_ADD_SUBDIRECTORY) . Они включены в FILE_GENERIC_WRITE разрешения. Вы должны открывать каталоги с меньшим количеством разрешений, если вы используете дескриптор для создания файлов или подкаталогов; в противном случае может произойти нарушение общего доступа.

Невозможно открыть файл с уровнем доступа FILE_EXECUTE, если этот файл является частью другой транзакции (т. е. другое приложение открыло его путем вызова CreateFileTransacted). Это означает, что CreateFileTransacted завершается ошибкой, если указан уровень доступа FILE_EXECUTE или FILE_ALL_ACCESS

Когда непереработанные приложения вызывают CreateFileTransacted с MAXIMUM_ALLOWED, указанными для lpSecurityAttributes, дескриптор открывается с одинаковым уровнем доступа каждый раз. Когда транзакционированные приложения вызывают CreateFileTransacted с MAXIMUM_ALLOWED, указанными для lpSecurityAttributes, дескриптор открывается с разными объемами доступа в зависимости от того, заблокирован ли файл транзакцией. Например, если вызывающее приложение имеет уровень доступа FILE_EXECUTE для файла, приложение получает доступ только в том случае, если открытый файл либо не заблокирован транзакцией, либо заблокирован транзакцией, либо заблокирован транзакцией, и приложение уже является трансактированным средством чтения для этого файла.

Полный описание транзакционных операций см. в NTFS.

Используйте функцию CloseHandle, чтобы закрыть дескриптор объекта, возвращаемый CreateFileTransacted, если дескриптор больше не нужен, а до фиксации или отката транзакции.

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

Нельзя использовать CreateFileTransacted для управления сжатием файла или каталога. Дополнительные сведения см. в сжатия файлов и декомпрессии ишифрования файлов.

Поведение символьной связи. Если вызов этой функции создает новый файл, в поведении нет изменений.

Если указан FILE_FLAG_OPEN_REPARSE_POINT:

  • Если существующий файл открыт и является символьной ссылкой, возвращенный дескриптором является дескриптор символьной ссылкой.
  • Если указаны TRUNCATE_EXISTING или FILE_FLAG_DELETE_ON_CLOSE, затронутый файлом является символьная ссылка.
Если FILE_FLAG_OPEN_REPARSE_POINT не задано:
  • Если существующий файл открыт и является символьной ссылкой, возвращенный дескриптором является дескриптор целевого объекта.
  • Если указаны CREATE_ALWAYS, TRUNCATE_EXISTINGили FILE_FLAG_DELETE_ON_CLOSE, затронутый файлом является целевой объект.
Запись в нескольких секторах не гарантируется атомарным, если вы не используете транзакцию (т. е. созданный дескриптор представляет собой транзакционный дескриптор). Одноуровневая запись атомарна. Записи в нескольких секторах, которые кэшируются, могут не всегда записываться на диск; поэтому укажите FILE_FLAG_WRITE_THROUGH, чтобы обеспечить запись всего нескольких секторов на диск без кэширования.

Как упоминалось ранее, если параметр lpSecurityAttributes имеет значение NULL, то дескриптор, возвращаемый CreateFileTransacted, не может быть унаследован любым дочерним процессом, который может создать приложение. Следующие сведения об этом параметре также применяются:

  • Если bInheritHandle не FALSE, что является любым ненулевом значением, то дескриптор может быть унаследован. Поэтому важно правильно инициализировать этот элемент структуры для FALSE, если дескриптор не будет наследуемым.
  • Списки управления доступом (ACL) в дескрипторе безопасности по умолчанию для файла или каталога наследуются от родительского каталога.
  • Целевая файловая система должна поддерживать безопасность файлов и каталогов для lpSecurityDescriptor, чтобы иметь влияние на них, которые можно определить с помощью GetVolumeInformation
В Windows 8 и Windows Server 2012 эта функция поддерживается следующими технологиями.
Технологии Поддержанный
Протокол SMB 3.0 Нет
Отработка отказа SMB 3.0 (TFO) Нет
SMB 3.0 с масштабируемыми общими папками (SO) Нет
Файловая система общего тома кластера (CSVFS) Нет
Отказоустойчивая файловая система (ReFS) Нет
 

Обратите внимание, что SMB 3.0 не поддерживает TxF.

файлы

Если вы попытаетесь создать файл на диске с флоппи-диском, который не имеет диска floppy или диска CD-ROM, который не имеет компакт-диска, система отображает сообщение для пользователя, чтобы вставить диск или компакт-диск. Чтобы предотвратить отображение этого сообщения системой, вызовите функцию SetErrorMode с SEM_FAILCRITICALERRORS.

Дополнительные сведения см. в создании и открытии файлов.

Если вы переименовываете или удаляете файл, а затем восстанавливаете его в ближайшее время, система выполняет поиск в кэше сведений о файлах для восстановления. Кэшированные сведения включают в себя пару коротких и длинных имен и время создания.

При вызове CreateFileTransacted в файле, ожидающем удаления в результате предыдущего вызова DeleteFile, функция завершается ошибкой. Операционная система задерживает удаление файлов до закрытия всех дескрипторов файла. GetLastError возвращает ERROR_ACCESS_DENIED.

Параметр dwDesiredAccess может быть нулевым, что позволяет приложению запрашивать атрибуты файлов без доступа к файлу, если приложение работает с соответствующими параметрами безопасности. Это полезно для проверки существования файла, не открывая его для доступа на чтение и (или) запись, или получить другую статистику о файле или каталоге. См. получение и настройка сведений о файлах и GetFileInformationByHandle.

Когда приложение создает файл в сети, лучше использовать GENERIC_READ | GENERIC_WRITE, чем использовать только GENERIC_WRITE. Результирующий код быстрее, так как перенаправитель может использовать диспетчер кэша и отправлять меньше SMOB-объектов с большим количеством данных. Это сочетание также позволяет избежать проблемы, при которой запись в файл в сети может иногда возвращать ERROR_ACCESS_DENIED.

файловых потоков

В файловых системах NTFS можно использовать CreateFileTransacted для создания отдельных потоков в файле.

Дополнительные сведения см. в разделе файловых потоков.

Каталоги

Приложение не может создать каталог с помощью CreateFileTransacted, поэтому только значение OPEN_EXISTING допустимо для dwCreationDisposition для этого варианта использования. Чтобы создать каталог, приложение должно вызвать CreateDirectoryTransacted, CreateDirectory или CreateDirectoryEx.

Чтобы открыть каталог с помощью CreateFileTransacted, укажите флаг FILE_FLAG_BACKUP_SEMANTICS в составе dwFlagsAndAttributes. Соответствующие проверки безопасности по-прежнему применяются, если этот флаг используется без SE_BACKUP_NAME и SE_RESTORE_NAME привилегий.

При использовании CreateFileTransacted для открытия каталога во время дефрагментации тома файловой системы FAT или FAT32 не указывайте право доступа MAXIMUM_ALLOWED. Если это сделано, доступ к каталогу запрещен. Укажите GENERIC_READ право доступа.

Дополнительные сведения см. в оуправления каталогами.

Заметка

Заголовок winbase.h определяет CreateFileTransacted как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows Vista [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2008 [только классические приложения]
целевая платформа Виндоус
заголовка winbase.h (включая Windows.h)
библиотеки Kernel32.lib
DLL Kernel32.dll

См. также

CloseHandle

CopyFileTransacted

CreateDirectoryTransacted

DeleteFileTransacted

сжатия файлов и декомпрессии

шифрование файлов

функции управления файлами

права на безопасность и доступ к файлам

файловых потоков

FindFirstFileTransacted

Функции

GetFileAttributesTransacted

MoveFileTransacted

разделах обзора

Рекомендации по программированию транзакций NTFS

ReadFile

транзакционных NTFS (TxF)

WriteFile