file_management.hpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. /*
  2. * Copyright 2010 Vicente J. Botet Escriba
  3. * Copyright 2015 Andrey Semashev
  4. * Copyright 2016 Jorge Lodos
  5. * Copyright 2017 James E. King, III
  6. *
  7. * Distributed under the Boost Software License, Version 1.0.
  8. * See http://www.boost.org/LICENSE_1_0.txt
  9. */
  10. #ifndef BOOST_WINAPI_FILE_MANAGEMENT_HPP_INCLUDED_
  11. #define BOOST_WINAPI_FILE_MANAGEMENT_HPP_INCLUDED_
  12. #include <boost/winapi/basic_types.hpp>
  13. #include <boost/winapi/limits.hpp>
  14. #include <boost/winapi/time.hpp>
  15. #include <boost/winapi/overlapped.hpp>
  16. #ifdef BOOST_HAS_PRAGMA_ONCE
  17. #pragma once
  18. #endif
  19. /*
  20. * UWP:
  21. * API SDK 8 SDK 10 _WIN32_WINNT
  22. * AreFileApisANSI DESKTOP - DESKTOP | SYSTEM
  23. * CreateFile DESKTOP - DESKTOP | SYSTEM
  24. * DeleteFile APP - APP | SYSTEM
  25. * FindClose APP - APP | SYSTEM
  26. * FindFirstFile DESKTOP > APP | SYSTEM
  27. * FindNextFile DESKTOP > APP | SYSTEM
  28. * GetFileAttributes DESKTOP > APP | SYSTEM
  29. * GetFileInformationByHandle DESKTOP - DESKTOP | SYSTEM
  30. * GetFileSizeEx DESKTOP > APP | SYSTEM
  31. * LockFile DESKTOP - DESKTOP | SYSTEM
  32. * MoveFileEx APP - APP | SYSTEM
  33. * ReadFile APP - APP | SYSTEM
  34. * SetEndOfFile APP - APP | SYSTEM
  35. * SetFilePointer DESKTOP > APP | SYSTEM
  36. * SetFileValidData DESKTOP - DESKTOP | SYSTEM >= 0x0501
  37. * UnlockFile DESKTOP - DESKTOP | SYSTEM
  38. * WriteFile APP - APP | SYSTEM
  39. */
  40. #if !defined( BOOST_USE_WINDOWS_H )
  41. extern "C" {
  42. #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
  43. #if !defined( BOOST_NO_ANSI_APIS )
  44. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  45. AreFileApisANSI(BOOST_WINAPI_DETAIL_VOID);
  46. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  47. CreateFileA(
  48. boost::winapi::LPCSTR_ lpFileName,
  49. boost::winapi::DWORD_ dwDesiredAccess,
  50. boost::winapi::DWORD_ dwShareMode,
  51. ::_SECURITY_ATTRIBUTES* lpSecurityAttributes,
  52. boost::winapi::DWORD_ dwCreationDisposition,
  53. boost::winapi::DWORD_ dwFlagsAndAttributes,
  54. boost::winapi::HANDLE_ hTemplateFile);
  55. struct _WIN32_FIND_DATAA;
  56. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  57. FindFirstFileA(boost::winapi::LPCSTR_ lpFileName, ::_WIN32_FIND_DATAA* lpFindFileData);
  58. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  59. FindNextFileA(boost::winapi::HANDLE_ hFindFile, ::_WIN32_FIND_DATAA* lpFindFileData);
  60. #endif
  61. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  62. CreateFileW(
  63. boost::winapi::LPCWSTR_ lpFileName,
  64. boost::winapi::DWORD_ dwDesiredAccess,
  65. boost::winapi::DWORD_ dwShareMode,
  66. ::_SECURITY_ATTRIBUTES* lpSecurityAttributes,
  67. boost::winapi::DWORD_ dwCreationDisposition,
  68. boost::winapi::DWORD_ dwFlagsAndAttributes,
  69. boost::winapi::HANDLE_ hTemplateFile);
  70. struct _WIN32_FIND_DATAW;
  71. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  72. FindFirstFileW(boost::winapi::LPCWSTR_ lpFileName, ::_WIN32_FIND_DATAW* lpFindFileData);
  73. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  74. FindNextFileW(boost::winapi::HANDLE_ hFindFile, ::_WIN32_FIND_DATAW* lpFindFileData);
  75. struct _BY_HANDLE_FILE_INFORMATION;
  76. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  77. GetFileInformationByHandle(
  78. boost::winapi::HANDLE_ hFile,
  79. ::_BY_HANDLE_FILE_INFORMATION* lpFileInformation);
  80. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  81. LockFile(
  82. boost::winapi::HANDLE_ hFile,
  83. boost::winapi::DWORD_ dwFileOffsetLow,
  84. boost::winapi::DWORD_ dwFileOffsetHigh,
  85. boost::winapi::DWORD_ nNumberOfBytesToLockLow,
  86. boost::winapi::DWORD_ nNumberOfBytesToLockHigh);
  87. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  88. LockFileEx(
  89. boost::winapi::HANDLE_ hFile,
  90. boost::winapi::DWORD_ dwFlags,
  91. boost::winapi::DWORD_ dwReserved,
  92. boost::winapi::DWORD_ nNumberOfBytesToLockLow,
  93. boost::winapi::DWORD_ nNumberOfBytesToLockHigh,
  94. ::_OVERLAPPED* lpOverlapped);
  95. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WINXP
  96. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  97. SetFileValidData(
  98. boost::winapi::HANDLE_ hFile,
  99. boost::winapi::LONGLONG_ ValidDataLength);
  100. #endif
  101. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  102. UnlockFile(
  103. boost::winapi::HANDLE_ hFile,
  104. boost::winapi::DWORD_ dwFileOffsetLow,
  105. boost::winapi::DWORD_ dwFileOffsetHigh,
  106. boost::winapi::DWORD_ nNumberOfBytesToUnlockLow,
  107. boost::winapi::DWORD_ nNumberOfBytesToUnlockHigh);
  108. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  109. UnlockFileEx(
  110. boost::winapi::HANDLE_ hFile,
  111. boost::winapi::DWORD_ dwReserved,
  112. boost::winapi::DWORD_ nNumberOfBytesToUnlockLow,
  113. boost::winapi::DWORD_ nNumberOfBytesToUnlockHigh,
  114. ::_OVERLAPPED* lpOverlapped);
  115. #endif
  116. #if BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
  117. #if !defined( BOOST_NO_ANSI_APIS )
  118. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  119. DeleteFileA(boost::winapi::LPCSTR_ lpFileName);
  120. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  121. MoveFileExA(
  122. boost::winapi::LPCSTR_ lpExistingFileName,
  123. boost::winapi::LPCSTR_ lpNewFileName,
  124. boost::winapi::DWORD_ dwFlags);
  125. #endif
  126. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  127. DeleteFileW(boost::winapi::LPCWSTR_ lpFileName);
  128. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  129. FindClose(boost::winapi::HANDLE_ hFindFile);
  130. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  131. MoveFileExW(
  132. boost::winapi::LPCWSTR_ lpExistingFileName,
  133. boost::winapi::LPCWSTR_ lpNewFileName,
  134. boost::winapi::DWORD_ dwFlags);
  135. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  136. ReadFile(
  137. boost::winapi::HANDLE_ hFile,
  138. boost::winapi::LPVOID_ lpBuffer,
  139. boost::winapi::DWORD_ nNumberOfBytesToRead,
  140. boost::winapi::LPDWORD_ lpNumberOfBytesRead,
  141. ::_OVERLAPPED* lpOverlapped);
  142. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  143. SetEndOfFile(boost::winapi::HANDLE_ hFile);
  144. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  145. WriteFile(
  146. boost::winapi::HANDLE_ hFile,
  147. boost::winapi::LPCVOID_ lpBuffer,
  148. boost::winapi::DWORD_ nNumberOfBytesToWrite,
  149. boost::winapi::LPDWORD_ lpNumberOfBytesWritten,
  150. ::_OVERLAPPED* lpOverlapped);
  151. #endif // BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
  152. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  153. #if !defined( BOOST_NO_ANSI_APIS )
  154. BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
  155. GetFileAttributesA(boost::winapi::LPCSTR_ lpFileName);
  156. #endif
  157. BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
  158. GetFileAttributesW(boost::winapi::LPCWSTR_ lpFileName);
  159. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  160. GetFileSizeEx(boost::winapi::HANDLE_ hFile, ::_LARGE_INTEGER* lpFileSize);
  161. BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
  162. SetFilePointer(
  163. boost::winapi::HANDLE_ hFile,
  164. boost::winapi::LONG_ lpDistanceToMove,
  165. boost::winapi::PLONG_ lpDistanceToMoveHigh,
  166. boost::winapi::DWORD_ dwMoveMethod);
  167. #endif // BOOST_WINAPI_PARTITION_APP_SYSTEM
  168. } // extern "C"
  169. #endif // !defined(BOOST_USE_WINDOWS_H)
  170. namespace boost {
  171. namespace winapi {
  172. #if defined( BOOST_USE_WINDOWS_H )
  173. BOOST_CONSTEXPR_OR_CONST DWORD_ INVALID_FILE_SIZE_ = INVALID_FILE_SIZE;
  174. BOOST_CONSTEXPR_OR_CONST DWORD_ INVALID_SET_FILE_POINTER_ = INVALID_SET_FILE_POINTER;
  175. BOOST_CONSTEXPR_OR_CONST DWORD_ INVALID_FILE_ATTRIBUTES_ = INVALID_FILE_ATTRIBUTES;
  176. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_READONLY_ = FILE_ATTRIBUTE_READONLY;
  177. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_HIDDEN_ = FILE_ATTRIBUTE_HIDDEN;
  178. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_SYSTEM_ = FILE_ATTRIBUTE_SYSTEM;
  179. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_DIRECTORY_ = FILE_ATTRIBUTE_DIRECTORY;
  180. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_ARCHIVE_ = FILE_ATTRIBUTE_ARCHIVE;
  181. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_DEVICE_ = FILE_ATTRIBUTE_DEVICE;
  182. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_NORMAL_ = FILE_ATTRIBUTE_NORMAL;
  183. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_TEMPORARY_ = FILE_ATTRIBUTE_TEMPORARY;
  184. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_SPARSE_FILE_ = FILE_ATTRIBUTE_SPARSE_FILE;
  185. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_REPARSE_POINT_ = FILE_ATTRIBUTE_REPARSE_POINT;
  186. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_COMPRESSED_ = FILE_ATTRIBUTE_COMPRESSED;
  187. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_OFFLINE_ = FILE_ATTRIBUTE_OFFLINE;
  188. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_NOT_CONTENT_INDEXED_ = FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
  189. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_ENCRYPTED_ = FILE_ATTRIBUTE_ENCRYPTED;
  190. BOOST_CONSTEXPR_OR_CONST DWORD_ CREATE_NEW_ = CREATE_NEW;
  191. BOOST_CONSTEXPR_OR_CONST DWORD_ CREATE_ALWAYS_ = CREATE_ALWAYS;
  192. BOOST_CONSTEXPR_OR_CONST DWORD_ OPEN_EXISTING_ = OPEN_EXISTING;
  193. BOOST_CONSTEXPR_OR_CONST DWORD_ OPEN_ALWAYS_ = OPEN_ALWAYS;
  194. BOOST_CONSTEXPR_OR_CONST DWORD_ TRUNCATE_EXISTING_ = TRUNCATE_EXISTING;
  195. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_SHARE_READ_ = FILE_SHARE_READ;
  196. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_SHARE_WRITE_ = FILE_SHARE_WRITE;
  197. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_SHARE_DELETE_ = FILE_SHARE_DELETE;
  198. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_BEGIN_ = FILE_BEGIN;
  199. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_CURRENT_ = FILE_CURRENT;
  200. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_END_ = FILE_END;
  201. #else // defined( BOOST_USE_WINDOWS_H )
  202. BOOST_CONSTEXPR_OR_CONST DWORD_ INVALID_FILE_SIZE_ = ((DWORD_)0xFFFFFFFF);
  203. BOOST_CONSTEXPR_OR_CONST DWORD_ INVALID_SET_FILE_POINTER_ = ((DWORD_)-1);
  204. BOOST_CONSTEXPR_OR_CONST DWORD_ INVALID_FILE_ATTRIBUTES_ = ((DWORD_)-1);
  205. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_READONLY_ = 0x00000001;
  206. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_HIDDEN_ = 0x00000002;
  207. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_SYSTEM_ = 0x00000004;
  208. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_DIRECTORY_ = 0x00000010;
  209. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_ARCHIVE_ = 0x00000020;
  210. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_DEVICE_ = 0x00000040;
  211. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_NORMAL_ = 0x00000080;
  212. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_TEMPORARY_ = 0x00000100;
  213. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_SPARSE_FILE_ = 0x00000200;
  214. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_REPARSE_POINT_ = 0x00000400;
  215. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_COMPRESSED_ = 0x00000800;
  216. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_OFFLINE_ = 0x00001000;
  217. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_NOT_CONTENT_INDEXED_ = 0x00002000;
  218. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_ENCRYPTED_ = 0x00004000;
  219. BOOST_CONSTEXPR_OR_CONST DWORD_ CREATE_NEW_ = 1;
  220. BOOST_CONSTEXPR_OR_CONST DWORD_ CREATE_ALWAYS_ = 2;
  221. BOOST_CONSTEXPR_OR_CONST DWORD_ OPEN_EXISTING_ = 3;
  222. BOOST_CONSTEXPR_OR_CONST DWORD_ OPEN_ALWAYS_ = 4;
  223. BOOST_CONSTEXPR_OR_CONST DWORD_ TRUNCATE_EXISTING_ = 5;
  224. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_SHARE_READ_ = 0x00000001;
  225. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_SHARE_WRITE_ = 0x00000002;
  226. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_SHARE_DELETE_ = 0x00000004;
  227. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_BEGIN_ = 0;
  228. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_CURRENT_ = 1;
  229. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_END_ = 2;
  230. #endif // defined( BOOST_USE_WINDOWS_H )
  231. // Some of these constants are not defined by Windows SDK in MinGW or older MSVC
  232. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_WRITE_THROUGH_ = 0x80000000;
  233. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_OVERLAPPED_ = 0x40000000;
  234. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_NO_BUFFERING_ = 0x20000000;
  235. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_RANDOM_ACCESS_ = 0x10000000;
  236. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_SEQUENTIAL_SCAN_ = 0x08000000;
  237. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_DELETE_ON_CLOSE_ = 0x04000000;
  238. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_BACKUP_SEMANTICS_ = 0x02000000;
  239. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_POSIX_SEMANTICS_ = 0x01000000;
  240. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_SESSION_AWARE_ = 0x00800000;
  241. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_OPEN_REPARSE_POINT_ = 0x00200000;
  242. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_OPEN_NO_RECALL_ = 0x00100000;
  243. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_FIRST_PIPE_INSTANCE_ = 0x00080000;
  244. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN8
  245. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_FLAG_OPEN_REQUIRING_OPLOCK_ = 0x00040000;
  246. #endif
  247. // This constant is not defined in Windows SDK up until 6.0A
  248. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_VIRTUAL_ = 0x00010000;
  249. // These constants are not defined in Windows SDK up until 8.0 and MinGW/MinGW-w64 (as of 2016-02-14).
  250. // They are documented to be supported only since Windows 8/Windows Server 2012
  251. // but defined unconditionally.
  252. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_INTEGRITY_STREAM_ = 0x00008000;
  253. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_NO_SCRUB_DATA_ = 0x00020000;
  254. // Undocumented
  255. BOOST_CONSTEXPR_OR_CONST DWORD_ FILE_ATTRIBUTE_EA_ = 0x00040000;
  256. #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
  257. #if !defined( BOOST_NO_ANSI_APIS )
  258. using ::AreFileApisANSI;
  259. BOOST_FORCEINLINE HANDLE_ CreateFileA(
  260. LPCSTR_ lpFileName,
  261. DWORD_ dwDesiredAccess,
  262. DWORD_ dwShareMode,
  263. SECURITY_ATTRIBUTES_* lpSecurityAttributes,
  264. DWORD_ dwCreationDisposition,
  265. DWORD_ dwFlagsAndAttributes,
  266. HANDLE_ hTemplateFile)
  267. {
  268. return ::CreateFileA(
  269. lpFileName,
  270. dwDesiredAccess,
  271. dwShareMode,
  272. reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes),
  273. dwCreationDisposition,
  274. dwFlagsAndAttributes,
  275. hTemplateFile);
  276. }
  277. BOOST_FORCEINLINE HANDLE_ create_file(
  278. LPCSTR_ lpFileName,
  279. DWORD_ dwDesiredAccess,
  280. DWORD_ dwShareMode,
  281. SECURITY_ATTRIBUTES_* lpSecurityAttributes,
  282. DWORD_ dwCreationDisposition,
  283. DWORD_ dwFlagsAndAttributes,
  284. HANDLE_ hTemplateFile)
  285. {
  286. return ::CreateFileA(
  287. lpFileName,
  288. dwDesiredAccess,
  289. dwShareMode,
  290. reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes),
  291. dwCreationDisposition,
  292. dwFlagsAndAttributes,
  293. hTemplateFile);
  294. }
  295. typedef struct BOOST_MAY_ALIAS _WIN32_FIND_DATAA {
  296. DWORD_ dwFileAttributes;
  297. FILETIME_ ftCreationTime;
  298. FILETIME_ ftLastAccessTime;
  299. FILETIME_ ftLastWriteTime;
  300. DWORD_ nFileSizeHigh;
  301. DWORD_ nFileSizeLow;
  302. DWORD_ dwReserved0;
  303. DWORD_ dwReserved1;
  304. CHAR_ cFileName[MAX_PATH_];
  305. CHAR_ cAlternateFileName[14];
  306. #ifdef _MAC
  307. DWORD_ dwFileType;
  308. DWORD_ dwCreatorType;
  309. WORD_ wFinderFlags;
  310. #endif
  311. } WIN32_FIND_DATAA_, *PWIN32_FIND_DATAA_, *LPWIN32_FIND_DATAA_;
  312. BOOST_FORCEINLINE HANDLE_ FindFirstFileA(LPCSTR_ lpFileName, WIN32_FIND_DATAA_* lpFindFileData)
  313. {
  314. return ::FindFirstFileA(lpFileName, reinterpret_cast< ::_WIN32_FIND_DATAA* >(lpFindFileData));
  315. }
  316. BOOST_FORCEINLINE HANDLE_ find_first_file(LPCSTR_ lpFileName, WIN32_FIND_DATAA_* lpFindFileData)
  317. {
  318. return ::FindFirstFileA(lpFileName, reinterpret_cast< ::_WIN32_FIND_DATAA* >(lpFindFileData));
  319. }
  320. BOOST_FORCEINLINE BOOL_ FindNextFileA(HANDLE_ hFindFile, WIN32_FIND_DATAA_* lpFindFileData)
  321. {
  322. return ::FindNextFileA(hFindFile, reinterpret_cast< ::_WIN32_FIND_DATAA* >(lpFindFileData));
  323. }
  324. BOOST_FORCEINLINE BOOL_ find_next_file(HANDLE_ hFindFile, WIN32_FIND_DATAA_* lpFindFileData)
  325. {
  326. return ::FindNextFileA(hFindFile, reinterpret_cast< ::_WIN32_FIND_DATAA* >(lpFindFileData));
  327. }
  328. #endif // !defined( BOOST_NO_ANSI_APIS )
  329. BOOST_FORCEINLINE HANDLE_ CreateFileW(
  330. LPCWSTR_ lpFileName,
  331. DWORD_ dwDesiredAccess,
  332. DWORD_ dwShareMode,
  333. SECURITY_ATTRIBUTES_* lpSecurityAttributes,
  334. DWORD_ dwCreationDisposition,
  335. DWORD_ dwFlagsAndAttributes,
  336. HANDLE_ hTemplateFile)
  337. {
  338. return ::CreateFileW(
  339. lpFileName,
  340. dwDesiredAccess,
  341. dwShareMode,
  342. reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes),
  343. dwCreationDisposition,
  344. dwFlagsAndAttributes,
  345. hTemplateFile);
  346. }
  347. BOOST_FORCEINLINE HANDLE_ create_file(
  348. LPCWSTR_ lpFileName,
  349. DWORD_ dwDesiredAccess,
  350. DWORD_ dwShareMode,
  351. SECURITY_ATTRIBUTES_* lpSecurityAttributes,
  352. DWORD_ dwCreationDisposition,
  353. DWORD_ dwFlagsAndAttributes,
  354. HANDLE_ hTemplateFile)
  355. {
  356. return ::CreateFileW(
  357. lpFileName,
  358. dwDesiredAccess,
  359. dwShareMode,
  360. reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes),
  361. dwCreationDisposition,
  362. dwFlagsAndAttributes,
  363. hTemplateFile);
  364. }
  365. typedef struct BOOST_MAY_ALIAS _WIN32_FIND_DATAW {
  366. DWORD_ dwFileAttributes;
  367. FILETIME_ ftCreationTime;
  368. FILETIME_ ftLastAccessTime;
  369. FILETIME_ ftLastWriteTime;
  370. DWORD_ nFileSizeHigh;
  371. DWORD_ nFileSizeLow;
  372. DWORD_ dwReserved0;
  373. DWORD_ dwReserved1;
  374. WCHAR_ cFileName[MAX_PATH_];
  375. WCHAR_ cAlternateFileName[14];
  376. #ifdef _MAC
  377. DWORD_ dwFileType;
  378. DWORD_ dwCreatorType;
  379. WORD_ wFinderFlags;
  380. #endif
  381. } WIN32_FIND_DATAW_, *PWIN32_FIND_DATAW_, *LPWIN32_FIND_DATAW_;
  382. typedef struct BOOST_MAY_ALIAS _BY_HANDLE_FILE_INFORMATION {
  383. DWORD_ dwFileAttributes;
  384. FILETIME_ ftCreationTime;
  385. FILETIME_ ftLastAccessTime;
  386. FILETIME_ ftLastWriteTime;
  387. DWORD_ dwVolumeSerialNumber;
  388. DWORD_ nFileSizeHigh;
  389. DWORD_ nFileSizeLow;
  390. DWORD_ nNumberOfLinks;
  391. DWORD_ nFileIndexHigh;
  392. DWORD_ nFileIndexLow;
  393. } BY_HANDLE_FILE_INFORMATION_, *PBY_HANDLE_FILE_INFORMATION_, *LPBY_HANDLE_FILE_INFORMATION_;
  394. BOOST_FORCEINLINE HANDLE_ FindFirstFileW(LPCWSTR_ lpFileName, WIN32_FIND_DATAW_* lpFindFileData)
  395. {
  396. return ::FindFirstFileW(lpFileName, reinterpret_cast< ::_WIN32_FIND_DATAW* >(lpFindFileData));
  397. }
  398. BOOST_FORCEINLINE HANDLE_ find_first_file(LPCWSTR_ lpFileName, WIN32_FIND_DATAW_* lpFindFileData)
  399. {
  400. return ::FindFirstFileW(lpFileName, reinterpret_cast< ::_WIN32_FIND_DATAW* >(lpFindFileData));
  401. }
  402. BOOST_FORCEINLINE BOOL_ FindNextFileW(HANDLE_ hFindFile, WIN32_FIND_DATAW_* lpFindFileData)
  403. {
  404. return ::FindNextFileW(hFindFile, reinterpret_cast< ::_WIN32_FIND_DATAW* >(lpFindFileData));
  405. }
  406. BOOST_FORCEINLINE BOOL_ find_next_file(HANDLE_ hFindFile, WIN32_FIND_DATAW_* lpFindFileData)
  407. {
  408. return ::FindNextFileW(hFindFile, reinterpret_cast< ::_WIN32_FIND_DATAW* >(lpFindFileData));
  409. }
  410. BOOST_FORCEINLINE BOOL_ GetFileInformationByHandle(HANDLE_ h, BY_HANDLE_FILE_INFORMATION_* info)
  411. {
  412. return ::GetFileInformationByHandle(h, reinterpret_cast< ::_BY_HANDLE_FILE_INFORMATION* >(info));
  413. }
  414. using ::LockFile;
  415. BOOST_FORCEINLINE BOOL_ LockFileEx(
  416. HANDLE_ hFile,
  417. DWORD_ dwFlags,
  418. DWORD_ dwReserved,
  419. DWORD_ nNumberOfBytesToLockLow,
  420. DWORD_ nNumberOfBytesToLockHigh,
  421. OVERLAPPED_* lpOverlapped)
  422. {
  423. return ::LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
  424. }
  425. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WINXP
  426. using ::SetFileValidData;
  427. #endif
  428. using ::UnlockFile;
  429. BOOST_FORCEINLINE BOOL_ UnlockFileEx(
  430. HANDLE_ hFile,
  431. DWORD_ dwReserved,
  432. DWORD_ nNumberOfBytesToUnlockLow,
  433. DWORD_ nNumberOfBytesToUnlockHigh,
  434. OVERLAPPED_* lpOverlapped)
  435. {
  436. return ::UnlockFileEx(hFile, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
  437. }
  438. #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
  439. #if BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
  440. #if !defined( BOOST_NO_ANSI_APIS )
  441. using ::DeleteFileA;
  442. BOOST_FORCEINLINE BOOL_ delete_file(LPCSTR_ lpFileName)
  443. {
  444. return ::DeleteFileA(lpFileName);
  445. }
  446. using ::MoveFileExA;
  447. BOOST_FORCEINLINE BOOL_ move_file(LPCSTR_ lpExistingFileName, LPCSTR_ lpNewFileName, DWORD_ dwFlags)
  448. {
  449. return ::MoveFileExA(lpExistingFileName, lpNewFileName, dwFlags);
  450. }
  451. #endif
  452. using ::DeleteFileW;
  453. BOOST_FORCEINLINE BOOL_ delete_file(LPCWSTR_ lpFileName)
  454. {
  455. return ::DeleteFileW(lpFileName);
  456. }
  457. using ::FindClose;
  458. using ::MoveFileExW;
  459. BOOST_FORCEINLINE BOOL_ move_file(LPCWSTR_ lpExistingFileName, LPCWSTR_ lpNewFileName, DWORD_ dwFlags)
  460. {
  461. return ::MoveFileExW(lpExistingFileName, lpNewFileName, dwFlags);
  462. }
  463. BOOST_FORCEINLINE BOOL_ ReadFile(
  464. HANDLE_ hFile,
  465. LPVOID_ lpBuffer,
  466. DWORD_ nNumberOfBytesToWrite,
  467. LPDWORD_ lpNumberOfBytesWritten,
  468. OVERLAPPED_* lpOverlapped)
  469. {
  470. return ::ReadFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
  471. }
  472. using ::SetEndOfFile;
  473. BOOST_FORCEINLINE BOOL_ WriteFile(
  474. HANDLE_ hFile,
  475. LPCVOID_ lpBuffer,
  476. DWORD_ nNumberOfBytesToWrite,
  477. LPDWORD_ lpNumberOfBytesWritten,
  478. OVERLAPPED_* lpOverlapped)
  479. {
  480. return ::WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
  481. }
  482. #endif // BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
  483. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  484. #if !defined( BOOST_NO_ANSI_APIS )
  485. using ::GetFileAttributesA;
  486. BOOST_FORCEINLINE DWORD_ get_file_attributes(LPCSTR_ lpFileName)
  487. {
  488. return ::GetFileAttributesA(lpFileName);
  489. }
  490. #endif
  491. using ::GetFileAttributesW;
  492. BOOST_FORCEINLINE DWORD_ get_file_attributes(LPCWSTR_ lpFileName)
  493. {
  494. return ::GetFileAttributesW(lpFileName);
  495. }
  496. BOOST_FORCEINLINE BOOL_ GetFileSizeEx(HANDLE_ hFile, LARGE_INTEGER_* lpFileSize)
  497. {
  498. return ::GetFileSizeEx(hFile, reinterpret_cast< ::_LARGE_INTEGER* >(lpFileSize));
  499. }
  500. using ::SetFilePointer;
  501. #endif // BOOST_WINAPI_PARTITION_APP_SYSTEM
  502. }
  503. }
  504. #endif // BOOST_WINAPI_FILE_MANAGEMENT_HPP_INCLUDED_