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