using System;
using System.IO;
using System.Runtime.InteropServices;
namespace Vanara.PInvoke
{
public static partial class Kernel32
{
///
/// Copies an existing file to a new file. The behavior of this function is identical to CopyFile, except that this function
/// adheres to the Universal Windows Platform app security model.
///
///
/// The name of an existing file.
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
/// If lpExistingFileName does not exist, the function fails, and GetLastError returns ERROR_FILE_NOT_FOUND.
///
///
/// The name of the new file.
///
/// In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide
/// characters, call the Unicode version of the function and prepend "\\?\" to the path. For more information, see Naming a File.
///
///
/// For the unicode version of this function ( CopyFileFromAppW), you can opt-in to remove the MAX_PATH limitation
/// without prepending "\\?\". See the "Maximum Path Length Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// If this parameter is TRUE and the new file specified by lpNewFileName already exists, the function fails. If this
/// parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.
///
///
/// If the function succeeds, the return value is nonzero.
/// If the function fails, the return value is zero. To get extended error information, call GetLastError.
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-copyfilefromappw WINSTORAGEAPI BOOL noexcept
// CopyFileFromAppW( LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, BOOL bFailIfExists );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.CopyFileFromAppW", MinClient = PInvokeClient.Windows10)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CopyFileFromAppW(string lpExistingFileName, string lpNewFileName, [MarshalAs(UnmanagedType.Bool)] bool bFailIfExists);
///
/// Creates a new directory. The behavior of this function is identical to CreateDirectory, except that this function adheres
/// to the Universal Windows Platform app security model.
///
///
/// The path of the directory to be created.
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
///
/// A pointer to a SECURITY_ATTRIBUTES structure. The lpSecurityDescriptor member of the structure specifies a
/// security descriptor for the new directory. If lpSecurityAttributes is NULL, the directory gets a default security
/// descriptor. The ACLs in the default security descriptor for a directory are inherited from its parent directory.
///
/// The target file system must support security on files and directories for this parameter to have an effect.
///
///
/// If the function succeeds, the return value is nonzero.
///
/// If the function fails, the return value is zero. To get extended error information, call GetLastError. Possible errors
/// include the following.
///
///
///
/// Return code
/// Description
///
/// -
/// ERROR_ALREADY_EXISTS
/// The specified directory already exists.
///
/// -
/// ERROR_PATH_NOT_FOUND
/// One or more intermediate directories do not exist; this function will only create the final directory in the path.
///
///
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-createdirectoryfromappw WINSTORAGEAPI BOOL
// noexcept CreateDirectoryFromAppW( LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.CreateDirectoryFromAppW", MinClient = PInvokeClient.Windows10)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CreateDirectoryFromAppW(string lpPathName, [In, Optional] SECURITY_ATTRIBUTES lpSecurityAttributes);
///
/// Creates or opens a file or I/O device. The behavior of this function is identical to CreateFile2, except that this
/// function adheres to the Universal Windows Platform app security model.
///
///
/// The name of the file or device to be created or opened.
/// For information on special device names, see Defining an MS-DOS Device Name.
///
/// To create a file stream, specify the name of the file, a colon, and then the name of the stream. For more information, see File Streams.
///
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// The requested access to the file or device, which can be summarized as read, write, both or neither zero).
/// The most commonly used values are GENERIC_READ, GENERIC_WRITE, or both (
/// GENERIC_READ | GENERIC_WRITE
/// ). For more information, see Generic Access Rights, File Security and Access Rights, File Access Rights Constants, and ACCESS_MASK.
///
///
/// If this parameter is zero, the application can query certain metadata such as file, directory, or device attributes without
/// accessing that file or device, even if GENERIC_READ access would have been denied.
///
///
/// You cannot request an access mode that conflicts with the sharing mode that is specified by the dwShareMode parameter in an open
/// request that already has an open handle.
///
///
///
///
/// The requested sharing mode of the file or device, which can be read, write, both, delete, all of these, or none (refer to the
/// following table). Access requests to attributes or extended attributes are not affected by this flag.
///
///
/// If this parameter is zero and the function succeeds, the file or device cannot be shared and cannot be opened again until the
/// handle to the file or device is closed. For more information, see the Remarks section.
///
///
/// You can't request a sharing mode that conflicts with the access mode that is specified in an existing request that has an open
/// handle. This function would fail and the GetLastError function would return ERROR_SHARING_VIOLATION.
///
///
/// To enable a process to share a file or device while another process has the file or device open, use a compatible combination of
/// one or more of the following values. For more information about valid combinations of this parameter with the dwDesiredAccess
/// parameter, see Creating and Opening Files.
///
///
/// Note The sharing options for each open handle remain in effect until that handle is closed, regardless of process context.
///
///
///
/// Value
/// Meaning
///
/// -
/// 0 0x00000000
///
/// Prevents other processes from opening a file or device if they request delete, read, or write access. Exclusive access to a file
/// or directory is only granted if the application has write access to the file.
///
///
/// -
/// FILE_SHARE_DELETE 0x00000004
///
/// Enables subsequent open operations on a file or device to request delete access. Otherwise, other processes cannot open the file
/// or device if they request delete access. If this flag is not specified, but the file or device has been opened for delete
/// access, the function fails. Note Delete access allows both delete and rename operations.
///
///
/// -
/// FILE_SHARE_READ 0x00000001
///
/// Enables subsequent open operations on a file or device to request read access. Otherwise, other processes cannot open the file
/// or device if they request read access. If this flag is not specified, but the file or device has been opened for read access,
/// the function fails. If a file or directory is being opened and this flag is not specified, and the caller does not have write
/// access to the file or directory, the function fails.
///
///
/// -
/// FILE_SHARE_WRITE 0x00000002
///
/// Enables subsequent open operations on a file or device to request write access. Otherwise, other processes cannot open the file
/// or device if they request write access. If this flag is not specified, but the file or device has been opened for write access
/// or has a file mapping with write access, the function fails.
///
///
///
///
///
/// An action to take on a file or device that exists or does not exist.
/// For devices other than files, this parameter is usually set to OPEN_EXISTING.
/// This parameter must be one of the following values, which cannot be combined:
///
///
/// Value
/// Meaning
///
/// -
/// CREATE_ALWAYS 2
///
/// Creates a new file, always. If the specified file exists and is writable, the function overwrites the file, the function
/// succeeds, and last-error code is set to ERROR_ALREADY_EXISTS (183). If the specified file does not exist and is a valid path, a
/// new file is created, the function succeeds, and the last-error code is set to zero.
///
///
/// -
/// CREATE_NEW 1
///
/// Creates a new file, only if it does not already exist. If the specified file exists, the function fails and the last-error code
/// is set to ERROR_FILE_EXISTS (80). If the specified file does not exist and is a valid path to a writable location, a new file is created.
///
///
/// -
/// OPEN_ALWAYS 4
///
/// Opens a file, always. If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS
/// (183). If the specified file does not exist and is a valid path to a writable location, the function creates a file and the
/// last-error code is set to zero.
///
///
/// -
/// OPEN_EXISTING 3
///
/// Opens a file or device, only if it exists. If the specified file or device does not exist, the function fails and the last-error
/// code is set to ERROR_FILE_NOT_FOUND (2).
///
///
/// -
/// TRUNCATE_EXISTING 5
///
/// Opens a file and truncates it so that its size is zero bytes, only if it exists. If the specified file does not exist, the
/// function fails and the last-error code is set to ERROR_FILE_NOT_FOUND (2). The calling process must open the file with the
/// GENERIC_WRITE bit set as part of the dwDesiredAccess parameter.
///
///
///
///
/// Pointer to an optional CREATEFILE2_EXTENDED_PARAMETERS structure.
///
/// If the function succeeds, the return value is an open handle to the specified file, device, named pipe, or mail slot.
/// If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-createfile2fromappw WINSTORAGEAPI HANDLE
// noexcept CreateFile2FromAppW( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition,
// LPCREATEFILE2_EXTENDED_PARAMETERS pCreateExParams );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.CreateFile2FromAppW", MinClient = PInvokeClient.Windows10)]
public static extern SafeHFILE CreateFile2FromAppW(string lpFileName, FileAccess dwDesiredAccess, FileShare dwShareMode,
FileMode dwCreationDisposition, in CREATEFILE2_EXTENDED_PARAMETERS pCreateExParams);
///
/// Creates or opens a file or I/O device. The behavior of this function is identical to CreateFile2, except that this
/// function adheres to the Universal Windows Platform app security model.
///
///
/// The name of the file or device to be created or opened.
/// For information on special device names, see Defining an MS-DOS Device Name.
///
/// To create a file stream, specify the name of the file, a colon, and then the name of the stream. For more information, see File Streams.
///
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// The requested access to the file or device, which can be summarized as read, write, both or neither zero).
/// The most commonly used values are GENERIC_READ, GENERIC_WRITE, or both (
/// GENERIC_READ | GENERIC_WRITE
/// ). For more information, see Generic Access Rights, File Security and Access Rights, File Access Rights Constants, and ACCESS_MASK.
///
///
/// If this parameter is zero, the application can query certain metadata such as file, directory, or device attributes without
/// accessing that file or device, even if GENERIC_READ access would have been denied.
///
///
/// You cannot request an access mode that conflicts with the sharing mode that is specified by the dwShareMode parameter in an open
/// request that already has an open handle.
///
///
///
///
/// The requested sharing mode of the file or device, which can be read, write, both, delete, all of these, or none (refer to the
/// following table). Access requests to attributes or extended attributes are not affected by this flag.
///
///
/// If this parameter is zero and the function succeeds, the file or device cannot be shared and cannot be opened again until the
/// handle to the file or device is closed. For more information, see the Remarks section.
///
///
/// You can't request a sharing mode that conflicts with the access mode that is specified in an existing request that has an open
/// handle. This function would fail and the GetLastError function would return ERROR_SHARING_VIOLATION.
///
///
/// To enable a process to share a file or device while another process has the file or device open, use a compatible combination of
/// one or more of the following values. For more information about valid combinations of this parameter with the dwDesiredAccess
/// parameter, see Creating and Opening Files.
///
///
/// Note The sharing options for each open handle remain in effect until that handle is closed, regardless of process context.
///
///
///
/// Value
/// Meaning
///
/// -
/// 0 0x00000000
///
/// Prevents other processes from opening a file or device if they request delete, read, or write access. Exclusive access to a file
/// or directory is only granted if the application has write access to the file.
///
///
/// -
/// FILE_SHARE_DELETE 0x00000004
///
/// Enables subsequent open operations on a file or device to request delete access. Otherwise, other processes cannot open the file
/// or device if they request delete access. If this flag is not specified, but the file or device has been opened for delete
/// access, the function fails. Note Delete access allows both delete and rename operations.
///
///
/// -
/// FILE_SHARE_READ 0x00000001
///
/// Enables subsequent open operations on a file or device to request read access. Otherwise, other processes cannot open the file
/// or device if they request read access. If this flag is not specified, but the file or device has been opened for read access,
/// the function fails. If a file or directory is being opened and this flag is not specified, and the caller does not have write
/// access to the file or directory, the function fails.
///
///
/// -
/// FILE_SHARE_WRITE 0x00000002
///
/// Enables subsequent open operations on a file or device to request write access. Otherwise, other processes cannot open the file
/// or device if they request write access. If this flag is not specified, but the file or device has been opened for write access
/// or has a file mapping with write access, the function fails.
///
///
///
///
///
/// An action to take on a file or device that exists or does not exist.
/// For devices other than files, this parameter is usually set to OPEN_EXISTING.
/// This parameter must be one of the following values, which cannot be combined:
///
///
/// Value
/// Meaning
///
/// -
/// CREATE_ALWAYS 2
///
/// Creates a new file, always. If the specified file exists and is writable, the function overwrites the file, the function
/// succeeds, and last-error code is set to ERROR_ALREADY_EXISTS (183). If the specified file does not exist and is a valid path, a
/// new file is created, the function succeeds, and the last-error code is set to zero.
///
///
/// -
/// CREATE_NEW 1
///
/// Creates a new file, only if it does not already exist. If the specified file exists, the function fails and the last-error code
/// is set to ERROR_FILE_EXISTS (80). If the specified file does not exist and is a valid path to a writable location, a new file is created.
///
///
/// -
/// OPEN_ALWAYS 4
///
/// Opens a file, always. If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS
/// (183). If the specified file does not exist and is a valid path to a writable location, the function creates a file and the
/// last-error code is set to zero.
///
///
/// -
/// OPEN_EXISTING 3
///
/// Opens a file or device, only if it exists. If the specified file or device does not exist, the function fails and the last-error
/// code is set to ERROR_FILE_NOT_FOUND (2).
///
///
/// -
/// TRUNCATE_EXISTING 5
///
/// Opens a file and truncates it so that its size is zero bytes, only if it exists. If the specified file does not exist, the
/// function fails and the last-error code is set to ERROR_FILE_NOT_FOUND (2). The calling process must open the file with the
/// GENERIC_WRITE bit set as part of the dwDesiredAccess parameter.
///
///
///
///
/// Pointer to an optional CREATEFILE2_EXTENDED_PARAMETERS structure.
///
/// If the function succeeds, the return value is an open handle to the specified file, device, named pipe, or mail slot.
/// If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-createfile2fromappw WINSTORAGEAPI HANDLE
// noexcept CreateFile2FromAppW( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition,
// LPCREATEFILE2_EXTENDED_PARAMETERS pCreateExParams );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.CreateFile2FromAppW", MinClient = PInvokeClient.Windows10)]
public static extern SafeHFILE CreateFile2FromAppW(string lpFileName, FileAccess dwDesiredAccess, FileShare dwShareMode,
FileMode dwCreationDisposition, [In, Optional] IntPtr pCreateExParams);
///
/// Creates or opens a file or I/O device. The behavior of this function is identical to CreateFile, except that this
/// function adheres to the Universal Windows Platform app security model.
///
///
///
/// The name of the file or device to be created or opened. You may use either forward slashes (/) or backslashes (\) in this name.
///
///
/// In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide
/// characters, call the Unicode version of the function and prepend "\\?\" to the path. For more information, see Naming Files,
/// Paths, and Namespaces.
///
/// For information on special device names, see Defining an MS-DOS Device Name.
///
/// To create a file stream, specify the name of the file, a colon, and then the name of the stream. For more information, see File Streams.
///
///
/// For the unicode version of this function ( CreateFileFromAppW), you can opt-in to remove the MAX_PATH limitation
/// without prepending "\\?\". See the "Maximum Path Length Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// The requested access to the file or device, which can be summarized as read, write, both or neither zero).
/// The most commonly used values are GENERIC_READ, GENERIC_WRITE, or both (
/// GENERIC_READ | GENERIC_WRITE
/// ). For more information, see Generic Access Rights, File Security and Access Rights, File Access Rights Constants, and ACCESS_MASK.
///
///
/// If this parameter is zero, the application can query certain metadata such as file, directory, or device attributes without
/// accessing that file or device, even if GENERIC_READ access would have been denied.
///
///
/// You cannot request an access mode that conflicts with the sharing mode that is specified by the dwShareMode parameter in an open
/// request that already has an open handle.
///
///
///
///
/// The requested sharing mode of the file or device, which can be read, write, both, delete, all of these, or none (refer to the
/// following table). Access requests to attributes or extended attributes are not affected by this flag.
///
///
///
/// Value
/// Meaning
///
/// -
/// 0 0x00000000
/// Prevents other processes from opening a file or device if they request delete, read, or write access.
///
/// -
/// FILE_SHARE_DELETE 0x00000004
///
/// Enables subsequent open operations on a file or device to request delete access. Otherwise, other processes cannot open the file
/// or device if they request delete access. If this flag is not specified, but the file or device has been opened for delete
/// access, the function fails. Note Delete access allows both delete and rename operations.
///
///
/// -
/// FILE_SHARE_READ 0x00000001
///
/// Enables subsequent open operations on a file or device to request read access. Otherwise, other processes cannot open the file
/// or device if they request read access. If this flag is not specified, but the file or device has been opened for read access,
/// the function fails.
///
///
/// -
/// FILE_SHARE_WRITE 0x00000002
///
/// Enables subsequent open operations on a file or device to request write access. Otherwise, other processes cannot open the file
/// or device if they request write access. If this flag is not specified, but the file or device has been opened for write access
/// or has a file mapping with write access, the function fails.
///
///
///
///
///
///
/// A pointer to a SECURITY_ATTRIBUTES structure that contains two separate but related data members: an optional security
/// descriptor, and a Boolean value that determines whether the returned handle can be inherited by child processes.
///
/// This parameter can be NULL.
///
/// If this parameter is NULL, the handle returned cannot be inherited by any child processes the application may create and
/// the file or device associated with the returned handle gets a default security descriptor.
///
///
/// The lpSecurityDescriptor member of the structure specifies a SECURITY_DESCRIPTOR for a file or device. If this
/// member is NULL, the file or device associated with the returned handle is assigned a default security descriptor.
///
///
/// This function ignores the lpSecurityDescriptor member when opening an existing file or device, but continues to use the
/// bInheritHandle member.
///
/// The bInheritHandle member of the structure specifies whether the returned handle can be inherited.
///
///
/// An action to take on a file or device that exists or does not exist.
/// For devices other than files, this parameter is usually set to OPEN_EXISTING.
/// For more information, see the Remarks section.
/// This parameter must be one of the following values, which cannot be combined:
///
///
/// Value
/// Meaning
///
/// -
/// CREATE_ALWAYS 2
///
/// Creates a new file, always. If the specified file exists and is writable, the function overwrites the file, the function
/// succeeds, and last-error code is set to ERROR_ALREADY_EXISTS (183). If the specified file does not exist and is a valid path, a
/// new file is created, the function succeeds, and the last-error code is set to zero. For more information, see the Remarks
/// section of this topic.
///
///
/// -
/// CREATE_NEW 1
///
/// Creates a new file, only if it does not already exist. If the specified file exists, the function fails and the last-error code
/// is set to ERROR_FILE_EXISTS (80). If the specified file does not exist and is a valid path to a writable location, a new file is created.
///
///
/// -
/// OPEN_ALWAYS 4
///
/// Opens a file, always. If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS
/// (183). If the specified file does not exist and is a valid path to a writable location, the function creates a file and the
/// last-error code is set to zero.
///
///
/// -
/// OPEN_EXISTING 3
///
/// Opens a file or device, only if it exists. If the specified file or device does not exist, the function fails and the last-error
/// code is set to ERROR_FILE_NOT_FOUND (2). For more information about devices, see the Remarks section.
///
///
/// -
/// TRUNCATE_EXISTING 5
///
/// Opens a file and truncates it so that its size is zero bytes, only if it exists. If the specified file does not exist, the
/// function fails and the last-error code is set to ERROR_FILE_NOT_FOUND (2). The calling process must open the file with the
/// GENERIC_WRITE bit set as part of the dwDesiredAccess parameter.
///
///
///
///
///
/// The file or device attributes and flags, FILE_ATTRIBUTE_NORMAL being the most common default value for files.
///
/// This parameter can include any combination of the available file attributes ( FILE_ATTRIBUTE_*). All other file
/// attributes override FILE_ATTRIBUTE_NORMAL.
///
///
/// This parameter can also contain combinations of flags ( FILE_FLAG_*) for control of file or device caching behavior,
/// access modes, and other special-purpose flags. These combine with any FILE_ATTRIBUTE_* values.
///
///
/// This parameter can also contain Security Quality of Service (SQOS) information by specifying the SECURITY_SQOS_PRESENT
/// flag. Additional SQOS-related flags information is presented in the table following the attributes and flags tables.
///
///
///
/// Attribute
/// Meaning
///
/// -
/// FILE_ATTRIBUTE_ARCHIVE 32 (0x20)
/// The file should be archived. Applications use this attribute to mark files for backup or removal.
///
/// -
/// FILE_ATTRIBUTE_ENCRYPTED 16384 (0x4000)
///
/// The file or directory is encrypted. For a file, this means that all data in the file is encrypted. For a directory, this means
/// that encryption is the default for newly created files and subdirectories. For more information, see File Encryption. This flag
/// has no effect if FILE_ATTRIBUTE_SYSTEM is also specified. This flag is not supported on Home, Home Premium, Starter, or ARM
/// editions of Windows.
///
///
/// -
/// FILE_ATTRIBUTE_HIDDEN 2 (0x2)
/// The file is hidden. Do not include it in an ordinary directory listing.
///
/// -
/// FILE_ATTRIBUTE_NORMAL 128 (0x80)
/// The file does not have other attributes set. This attribute is valid only if used alone.
///
/// -
/// FILE_ATTRIBUTE_OFFLINE 4096 (0x1000)
///
/// The data of a file is not immediately available. This attribute indicates that file data is physically moved to offline storage.
/// This attribute is used by Remote Storage, the hierarchical storage management software. Applications should not arbitrarily
/// change this attribute.
///
///
/// -
/// FILE_ATTRIBUTE_READONLY 1 (0x1)
/// The file is read only. Applications can read the file, but cannot write to or delete it.
///
/// -
/// FILE_ATTRIBUTE_SYSTEM 4 (0x4)
/// The file is part of or used exclusively by an operating system.
///
/// -
/// FILE_ATTRIBUTE_TEMPORARY 256 (0x100)
/// The file is being used for temporary storage. For more information, see the Caching Behavior section of this topic.
///
///
///
///
/// Flag
/// Meaning
///
/// -
/// FILE_FLAG_BACKUP_SEMANTICS 0x02000000
///
/// The file is being opened or created for a backup or restore operation. The system ensures that the calling process overrides
/// file security checks when the process has SE_BACKUP_NAME and SE_RESTORE_NAME privileges. For more information, see Changing
/// Privileges in a Token. You must set this flag to obtain a handle to a directory. A directory handle can be passed to some
/// functions instead of a file handle. For more information, see the Remarks section.
///
///
/// -
/// FILE_FLAG_DELETE_ON_CLOSE 0x04000000
///
/// The file is to be deleted immediately after all of its handles are closed, which includes the specified handle and any other
/// open or duplicated handles. If there are existing open handles to a file, the call fails unless they were all opened with the
/// FILE_SHARE_DELETE share mode. Subsequent open requests for the file fail, unless the FILE_SHARE_DELETE share mode is specified.
///
///
/// -
/// FILE_FLAG_NO_BUFFERING 0x20000000
///
/// The file or device is being opened with no system caching for data reads and writes. This flag does not affect hard disk caching
/// or memory mapped files. There are strict requirements for successfully working with files opened with this function using the
/// FILE_FLAG_NO_BUFFERING flag, for details see File Buffering.
///
///
/// -
/// FILE_FLAG_OPEN_NO_RECALL 0x00100000
///
/// The file data is requested, but it should continue to be located in remote storage. It should not be transported back to local
/// storage. This flag is for use by remote storage systems.
///
///
/// -
/// FILE_FLAG_OPEN_REPARSE_POINT 0x00200000
///
/// Normal reparse point processing will not occur; this function will attempt to open the reparse point. When a file is opened, a
/// file handle is returned, whether or not the filter that controls the reparse point is operational. This flag cannot be used with
/// the CREATE_ALWAYS flag. If the file is not a reparse point, then this flag is ignored. For more information, see the Remarks section.
///
///
/// -
/// FILE_FLAG_OVERLAPPED 0x40000000
///
/// The file or device is being opened or created for asynchronous I/O. When subsequent I/O operations are completed on this handle,
/// the event specified in the OVERLAPPED structure will be set to the signaled state. If this flag is specified, the file can be
/// used for simultaneous read and write operations. If this flag is not specified, then I/O operations are serialized, even if the
/// calls to the read and write functions specify an OVERLAPPED structure. For information about considerations when using a file
/// handle created with this flag, see the Synchronous and Asynchronous I/O Handles section of this topic.
///
///
/// -
/// FILE_FLAG_POSIX_SEMANTICS 0x0100000
///
/// Access will occur according to POSIX rules. This includes allowing multiple files with names, differing only in case, for file
/// systems that support that naming. Use care when using this option, because files created with this flag may not be accessible by
/// applications that are written for MS-DOS or 16-bit Windows.
///
///
/// -
/// FILE_FLAG_RANDOM_ACCESS 0x10000000
///
/// Access is intended to be random. The system can use this as a hint to optimize file caching. This flag has no effect if the file
/// system does not support cached I/O and FILE_FLAG_NO_BUFFERING. For more information, see the Caching Behavior section of this topic.
///
///
/// -
/// FILE_FLAG_SESSION_AWARE 0x00800000
///
/// The file or device is being opened with session awareness. If this flag is not specified, then per-session devices (such as a
/// device using RemoteFX USB Redirection) cannot be opened by processes running in session 0. This flag has no effect for callers
/// not in session 0. This flag is supported only on server editions of Windows.
///
///
/// -
/// FILE_FLAG_SEQUENTIAL_SCAN 0x08000000
///
/// Access is intended to be sequential from beginning to end. The system can use this as a hint to optimize file caching. This flag
/// should not be used if read-behind (that is, reverse scans) will be used. This flag has no effect if the file system does not
/// support cached I/O and FILE_FLAG_NO_BUFFERING. For more information, see the Caching Behavior section of this topic.
///
///
/// -
/// FILE_FLAG_WRITE_THROUGH 0x80000000
///
/// Write operations will not go through any intermediate cache, they will go directly to disk. For additional information, see the
/// Caching Behavior section of this topic.
///
///
///
///
/// The dwFlagsAndAttributesparameter can also specify SQOS information. For more information, see Impersonation Levels. When the
/// calling application specifies the SECURITY_SQOS_PRESENT flag as part of dwFlagsAndAttributes, it can also contain one or
/// more of the following values.
///
///
///
/// Security flag
/// Meaning
///
/// -
/// SECURITY_ANONYMOUS
/// Impersonates a client at the Anonymous impersonation level.
///
/// -
/// SECURITY_CONTEXT_TRACKING
/// The security tracking mode is dynamic. If this flag is not specified, the security tracking mode is static.
///
/// -
/// SECURITY_DELEGATION
/// Impersonates a client at the Delegation impersonation level.
///
/// -
/// SECURITY_EFFECTIVE_ONLY
///
/// Only the enabled aspects of the client's security context are available to the server. If you do not specify this flag, all
/// aspects of the client's security context are available. This allows the client to limit the groups and privileges that a server
/// can use while impersonating the client.
///
///
/// -
/// SECURITY_IDENTIFICATION
/// Impersonates a client at the Identification impersonation level.
///
/// -
/// SECURITY_IMPERSONATION
///
/// Impersonate a client at the impersonation level. This is the default behavior if no other flags are specified along with the
/// SECURITY_SQOS_PRESENT flag.
///
///
///
///
///
///
/// A valid handle to a template file with the GENERIC_READ access right. The template file supplies file attributes and
/// extended attributes for the file that is being created.
///
/// This parameter can be NULL.
/// When opening an existing file, this parameter is ignored.
///
/// When opening a new encrypted file, the file inherits the discretionary access control list from its parent directory. For more
/// information, see File Encryption.
///
///
///
/// If the function succeeds, the return value is an open handle to the specified file, device, named pipe, or mail slot.
/// If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-createfilefromappw WINSTORAGEAPI HANDLE
// noexcept CreateFileFromAppW( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES
// lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.CreateFileFromAppW", MinClient = PInvokeClient.Windows10)]
public static extern SafeHFILE CreateFileFromAppW(string lpFileName, FileAccess dwDesiredAccess, FileShare dwShareMode,
[Optional] SECURITY_ATTRIBUTES lpSecurityAttributes, FileMode dwCreationDisposition, FileFlagsAndAttributes dwFlagsAndAttributes,
[Optional] HFILE hTemplateFile);
///
/// Deletes an existing file. The behavior of this function is identical to DeleteFile, except that this function adheres to
/// the Universal Windows Platform app security model.
///
///
/// The name of the file to be deleted.
///
/// In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide
/// characters, call the Unicode version of the function and prepend "\\?\" to the path. For more information, see Naming Files,
/// Paths, and Namespaces.
///
///
/// For the unicode version of this function ( DeleteFileFromAppW), you can opt-in to remove the MAX_PATH character
/// limitation without prepending "\\?\". See the "Maximum Path Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// If the function succeeds, the return value is nonzero.
/// If the function fails, the return value is zero (0). To get extended error information, call GetLastError.
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-deletefilefromappw WINSTORAGEAPI BOOL
// noexcept DeleteFileFromAppW( LPCWSTR lpFileName );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.DeleteFileFromAppW", MinClient = PInvokeClient.Windows10)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeleteFileFromAppW(string lpFileName);
///
/// Searches a directory for a file or subdirectory with a name and attributes that match those specified. The behavior of this
/// function is identical to FindFirstFileEx, except that this function adheres to the Universal Windows Platform app
/// security model.
///
///
///
/// The directory or path, and the file name. The file name can include wildcard characters, for example, an asterisk (*) or a
/// question mark (?).
///
///
/// This parameter should not be NULL, an invalid string (for example, an empty string or a string that is missing the
/// terminating null character), or end in a trailing backslash (\).
///
///
/// If the string ends with a wildcard, period, or directory name, the user must have access to the root and all subdirectories on
/// the path.
///
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// The information level of the returned data.
/// This parameter is one of the FINDEX_INFO_LEVELS enumeration values.
///
///
/// A pointer to the buffer that receives the file data.
/// The pointer type is determined by the level of information that is specified in the fInfoLevelId parameter.
///
///
/// The type of filtering to perform that is different from wildcard matching.
/// This parameter is one of the FINDEX_SEARCH_OPS enumeration values.
///
///
/// A pointer to the search criteria if the specified fSearchOp needs structured search information.
///
/// At this time, none of the supported fSearchOp values require extended search information. Therefore, this pointer must be NULL.
///
///
///
/// Specifies additional flags that control the search.
///
///
/// Value
/// Meaning
///
/// -
/// FIND_FIRST_EX_CASE_SENSITIVE 1
/// Searches are case-sensitive.
///
/// -
/// FIND_FIRST_EX_LARGE_FETCH 2
/// Uses a larger buffer for directory queries, which can increase performance of the find operation.
///
/// -
/// FIND_FIRST_EX_ON_DISK_ENTRIES_ONLY 4
///
/// Limits the results to files that are physically on disk. This flag is only relevant when a file virtualization filter is present.
///
///
///
///
///
///
/// If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or
/// FindClose, and the lpFindFileData parameter contains information about the first file or directory found.
///
///
/// If the function fails or fails to locate files from the search string in the lpFileName parameter, the return value is
/// INVALID_HANDLE_VALUE and the contents of lpFindFileData are indeterminate. To get extended error information, call the
/// GetLastError function.
///
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-findfirstfileexfromappw WINSTORAGEAPI HANDLE
// noexcept FindFirstFileExFromAppW( LPCWSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, FINDEX_SEARCH_OPS
// fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.FindFirstFileExFromAppW", MinClient = PInvokeClient.Windows10)]
public static extern SafeSearchHandle FindFirstFileExFromAppW(string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId,
out WIN32_FIND_DATA lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, [Optional] IntPtr lpSearchFilter, FIND_FIRST dwAdditionalFlags);
///
/// Retrieves attributes for a specified file or directory. The behavior of this function is identical to
/// GetFileAttributesEx, except that this function adheres to the Universal Windows Platform app security model.
///
///
///
/// A class of attribute information to retrieve.
/// This parameter can be the following value from the GET_FILEEX_INFO_LEVELS enumeration.
///
///
/// Value
/// Meaning
///
/// -
/// GetFileExInfoStandard
/// The lpFileInformation parameter is a WIN32_FILE_ATTRIBUTE_DATA structure.
///
///
///
///
/// A pointer to a buffer that receives the attribute information.
/// The type of attribute information that is stored into this buffer is determined by the value of fInfoLevelId.
///
///
/// If the function succeeds, the return value is a nonzero value.
/// If the function fails, the return value is zero (0). To get extended error information, call GetLastError.
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-getfileattributesexfromappw WINSTORAGEAPI
// BOOL noexcept GetFileAttributesExFromAppW( LPCWSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID lpFileInformation );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.GetFileAttributesExFromAppW", MinClient = PInvokeClient.Windows10)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetFileAttributesExFromAppW(string lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId,
out WIN32_FILE_ATTRIBUTE_DATA lpFileInformation);
///
/// Moves an existing file or a directory, including its children. The behavior of this function is identical to MoveFile,
/// except that this function adheres to the Universal Windows Platform app security model.
///
///
/// The current name of the file or directory on the local computer.
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
///
/// The new name for the file or directory. The new name must not already exist. A new file may be on a different file system or
/// drive. A new directory must be on the same drive.
///
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// If the function succeeds, the return value is nonzero.
/// If the function fails, the return value is zero. To get extended error information, call GetLastError.
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-movefilefromappw WINSTORAGEAPI BOOL noexcept
// MoveFileFromAppW( LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.MoveFileFromAppW", MinClient = PInvokeClient.Windows10)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool MoveFileFromAppW(string lpExistingFileName, string lpNewFileName);
///
/// Deletes an existing empty directory. The behavior of this function is identical to RemoveDirectory, except that this
/// function adheres to the Universal Windows Platform app security model.
///
///
///
/// The path of the directory to be removed. This path must specify an empty directory, and the calling process must have delete
/// access to the directory.
///
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
/// None
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-removedirectoryfromappw WINSTORAGEAPI BOOL
// noexcept RemoveDirectoryFromAppW( LPCWSTR lpPathName );
[DllImport(Lib.KernelBase, SetLastError = false, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.RemoveDirectoryFromAppW", MinClient = PInvokeClient.Windows10)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool RemoveDirectoryFromAppW(string lpPathName);
///
/// Replaces one file with another file, with the option of creating a backup copy of the original file. The behavior of this
/// function is identical to ReplaceFile, except that this function adheres to the Universal Windows Platform app security model.
///
///
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
/// This file is opened with the GENERIC_READ, DELETE, and SYNCHRONIZE access rights. The sharing mode is
/// FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE.
///
/// The caller must have write access to the file to be replaced. For more information, see File Security and Access Rights.
///
///
/// The name of the file that will replace the lpReplacedFileName file.
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
/// The function attempts to open this file with the SYNCHRONIZE, GENERIC_READ, GENERIC_WRITE, DELETE,
/// and WRITE_DAC access rights so that it can preserve all attributes and ACLs. If this fails, the function attempts to open
/// the file with the SYNCHRONIZE, GENERIC_READ, DELETE, and WRITE_DAC access rights. No sharing mode is specified.
///
///
///
///
/// The name of the file that will serve as a backup copy of the lpReplacedFileName file. If this parameter is NULL, no
/// backup file is created. See the Remarks section for implementation details on the backup file.
///
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// The replacement options. This parameter can be one or more of the following values.
///
///
/// Value
/// Meaning
///
/// -
/// REPLACEFILE_WRITE_THROUGH 0x00000001
/// This value is not supported.
///
/// -
/// REPLACEFILE_IGNORE_MERGE_ERRORS 0x00000002
///
/// Ignores errors that occur while merging information (such as attributes and ACLs) from the replaced file to the replacement
/// file. Therefore, if you specify this flag and do not have WRITE_DAC access, the function succeeds but the ACLs are not preserved.
///
///
/// -
/// REPLACEFILE_IGNORE_ACL_ERRORS 0x00000004
///
/// Ignores errors that occur while merging ACL information from the replaced file to the replacement file. Therefore, if you
/// specify this flag and do not have WRITE_DAC access, the function succeeds but the ACLs are not preserved. To compile an
/// application that uses this value, define the _WIN32_WINNT macro as 0x0600 or later.
///
///
///
///
/// Reserved for future use.
/// Reserved for future use.
///
/// If the function succeeds, the return value is nonzero.
///
/// If the function fails, the return value is zero. To get extended error information, call GetLastError. The following are
/// possible error codes for this function.
///
///
///
/// Return code/value
/// Description
///
/// -
/// ERROR_UNABLE_TO_MOVE_REPLACEMENT 1176 (0x498)
///
/// The replacement file could not be renamed. If lpBackupFileName was specified, the replaced and replacement files retain their
/// original file names. Otherwise, the replaced file no longer exists and the replacement file exists under its original name.
///
///
/// -
/// ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 1177 (0x499)
///
/// The replacement file could not be moved. The replacement file still exists under its original name; however, it has inherited
/// the file streams and attributes from the file it is replacing. The file to be replaced still exists with a different name. If
/// lpBackupFileName is specified, it will be the name of the replaced file.
///
///
/// -
/// ERROR_UNABLE_TO_REMOVE_REPLACED 1175 (0x497)
/// The replaced file could not be deleted. The replaced and replacement files retain their original file names.
///
///
///
/// If any other error is returned, such as ERROR_INVALID_PARAMETER, the replaced and replacement files will retain their
/// original file names. In this scenario, a backup file does not exist and it is not guaranteed that the replacement file will have
/// inherited all of the attributes and streams of the replaced file.
///
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-replacefilefromappw WINSTORAGEAPI BOOL
// noexcept ReplaceFileFromAppW( LPCWSTR lpReplacedFileName, LPCWSTR lpReplacementFileName, LPCWSTR lpBackupFileName, DWORD
// dwReplaceFlags, LPVOID lpExclude, LPVOID lpReserved );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.ReplaceFileFromAppW", MinClient = PInvokeClient.Windows10)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ReplaceFileFromAppW(string lpReplacedFileName, string lpReplacementFileName,
[Optional] string lpBackupFileName, REPLACEFILE dwReplaceFlags, [Optional] IntPtr lpExclude, [Optional] IntPtr lpReserved);
///
/// Sets the attributes for a file or directory. The behavior of this function is identical to SetFileAttributes, except that
/// this function adheres to the Universal Windows Platform app security model.
///
///
/// The name of the file whose attributes are to be set.
///
/// For information about opting out of the MAX_PATH limitation without prepending "\\?\", see the "Maximum Path Length
/// Limitation" section of Naming Files, Paths, and Namespaces for details.
///
///
///
/// The file attributes to set for the file.
/// This parameter can be one or more values, combined using the bitwise-OR operator. However, all other values override FILE_ATTRIBUTE_NORMAL.
/// Not all attributes are supported by this function.
/// The following is a list of supported attribute values.
///
///
/// Value
/// Meaning
///
/// -
/// FILE_ATTRIBUTE_ARCHIVE 32 (0x20)
///
/// A file or directory that is an archive file or directory. Applications typically use this attribute to mark files for backup or removal.
///
///
/// -
/// FILE_ATTRIBUTE_HIDDEN 2 (0x2)
/// The file or directory is hidden. It is not included in an ordinary directory listing.
///
/// -
/// FILE_ATTRIBUTE_NORMAL 128 (0x80)
/// A file that does not have other attributes set. This attribute is valid only when used alone.
///
/// -
/// FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 8192 (0x2000)
/// The file or directory is not to be indexed by the content indexing service.
///
/// -
/// FILE_ATTRIBUTE_OFFLINE 4096 (0x1000)
///
/// The data of a file is not available immediately. This attribute indicates that the file data is physically moved to offline
/// storage. This attribute is used by Remote Storage, which is the hierarchical storage management software. Applications should
/// not arbitrarily change this attribute.
///
///
/// -
/// FILE_ATTRIBUTE_READONLY 1 (0x1)
///
/// A file that is read-only. Applications can read the file, but cannot write to it or delete it. This attribute is not honored on directories.
///
///
/// -
/// FILE_ATTRIBUTE_SYSTEM 4 (0x4)
/// A file or directory that the operating system uses a part of, or uses exclusively.
///
/// -
/// FILE_ATTRIBUTE_TEMPORARY 256 (0x100)
///
/// A file that is being used for temporary storage. File systems avoid writing data back to mass storage if sufficient cache memory
/// is available, because typically, an application deletes a temporary file after the handle is closed. In that scenario, the
/// system can entirely avoid writing the data. Otherwise, the data is written after the handle is closed.
///
///
///
///
///
/// If the function succeeds, the return value is nonzero.
/// If the function fails, the return value is zero. To get extended error information, call GetLastError.
///
// https://docs.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-setfileattributesfromappw WINSTORAGEAPI BOOL
// noexcept SetFileAttributesFromAppW( LPCWSTR lpFileName, DWORD dwFileAttributes );
[DllImport(Lib.KernelBase, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("fileapifromapp.h", MSDNShortId = "NF:fileapifromapp.SetFileAttributesFromAppW", MinClient = PInvokeClient.Windows10)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetFileAttributesFromAppW(string lpFileName, FileFlagsAndAttributes dwFileAttributes);
}
}