MiKTeX 23.10-next
A scalable TeX distribution
Loading...
Searching...
No Matches
File.h
1/* miktex/Core/File.h: -*- C++ -*-
2
3 Copyright (C) 1996-2021 Christian Schenk
4
5 This file is part of the MiKTeX Core Library.
6
7 The MiKTeX Core Library is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2, or
10 (at your option) any later version.
11
12 The MiKTeX Core Library is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
14 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with the MiKTeX Core Library; if not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22#pragma once
23
24#if !defined(BBAFDEB7FCB3409B88E23A547CF822B6)
25#define BBAFDEB7FCB3409B88E23A547CF822B6
26
27#include <miktex/Core/config.h>
28
29#if defined(MIKTEX_WINDOWS)
30#include <Windows.h>
31#endif
32
33#include <cstddef>
34#include <cstdio>
35#include <ctime>
36
37#include <chrono>
38#include <fstream>
39#include <vector>
40
41#include <miktex/Util/OptionSet>
42#include <miktex/Util/PathName>
43
44#if defined(_MSC_VER)
45#pragma warning(push)
46// "The compiler encountered a deprecated declaration."
47#pragma warning( disable : 4996 )
48#endif
49
50MIKTEX_CORE_BEGIN_NAMESPACE;
51
53enum class FileMode
54{
59 Append,
61 Create,
65 Open,
68};
69
71enum class FileAccess
72{
73 None,
75 Read,
77 Write,
80};
81
83enum class FileAttribute
84{
89#if defined(MIKTEX_WINDOWS)
91 Hidden,
92#endif
93#if defined(MIKTEX_UNIX)
96#endif
97};
98
99typedef MiKTeX::Util::OptionSet<FileAttribute> FileAttributeSet;
100
103{
104 None,
107};
108
109typedef MiKTeX::Util::OptionSet<FileOpenOption> FileOpenOptionSet;
110
113{
117 TryHard,
118};
119
120typedef MiKTeX::Util::OptionSet<FileDeleteOption> FileDeleteOptionSet;
121
124{
129};
130
131typedef MiKTeX::Util::OptionSet<FileMoveOption> FileMoveOptionSet;
132
135{
142};
143
144typedef MiKTeX::Util::OptionSet<FileCopyOption> FileCopyOptionSet;
145
148{
154 Symbolic,
155};
156
157typedef MiKTeX::Util::OptionSet<CreateLinkOption> CreateLinkOptionSet;
158
161{
164};
165
166typedef MiKTeX::Util::OptionSet<FileExistsOption> FileExistsOptionSet;
167
171class MIKTEXNOVTABLE File
172{
173public:
174 File() = delete;
175
176public:
177 File(const File& other) = delete;
178
179public:
180 File& operator=(const File& other) = delete;
181
182public:
183 File(File&& other) = delete;
184
185public:
186 File& operator=(File&& other) = delete;
187
188public:
189 ~File() = delete;
190
194public:
195 static MIKTEXCORECEEAPI(void) Delete(const MiKTeX::Util::PathName& path, FileDeleteOptionSet options);
196
199public:
200 static MIKTEXCORECEEAPI(void) Delete(const MiKTeX::Util::PathName& path);
201
205public:
206 static MIKTEXCORECEEAPI(bool) Exists(const MiKTeX::Util::PathName& path, FileExistsOptionSet options);
207
210public:
211 static MIKTEXCORECEEAPI(bool) Exists(const MiKTeX::Util::PathName& path);
212
217public:
218 static MIKTEXCORECEEAPI(FileAttributeSet) GetAttributes(const MiKTeX::Util::PathName& path);
219
224public:
225 static MIKTEXCORECEEAPI(unsigned long) GetNativeAttributes(const MiKTeX::Util::PathName& path);
226
230public:
231 static MIKTEXCORECEEAPI(std::size_t) GetSize(const MiKTeX::Util::PathName& path);
232
237public:
238 static MIKTEXCORECEEAPI(void) Move(const MiKTeX::Util::PathName& source, const MiKTeX::Util::PathName& dest, FileMoveOptionSet option);
239
243public:
244 static void Move(const MiKTeX::Util::PathName& source, const MiKTeX::Util::PathName& dest)
245 {
246 Move(source, dest, {});
247 }
248
253public:
254 static MIKTEXCORECEEAPI(void) Copy(const MiKTeX::Util::PathName& source, const MiKTeX::Util::PathName &dest, FileCopyOptionSet options);
255
259public:
260 static void Copy(const MiKTeX::Util::PathName& source, const MiKTeX::Util::PathName& dest)
261 {
262 Copy(source, dest, { FileCopyOption::ReplaceExisting });
263 }
264
269public:
270 static MIKTEXCORECEEAPI(void) CreateLink(const MiKTeX::Util::PathName& oldName, const MiKTeX::Util::PathName& newName, CreateLinkOptionSet options);
271
275public:
276 static MIKTEXCORECEEAPI(bool) IsSymbolicLink(const MiKTeX::Util::PathName& path);
277
281public:
283
288public:
289 static MIKTEXCORECEEAPI(bool) Equals(const MiKTeX::Util::PathName& path1, const MiKTeX::Util::PathName& path2);
290
293public:
294 static MIKTEXCORECEEAPI(size_t) SetMaxOpen(size_t newMax);
295
301public:
302 static MIKTEXCORECEEAPI(FILE*) Open(const MiKTeX::Util::PathName& path, FileMode mode, FileAccess access);
303
310public:
311 static MIKTEXCORECEEAPI(FILE*) Open(const MiKTeX::Util::PathName& path, FileMode mode, FileAccess access, bool isTextFile);
312
320public:
321 static MIKTEXCORECEEAPI(FILE*) Open(const MiKTeX::Util::PathName& path, FileMode mode, FileAccess access, bool isTextFile, FileOpenOptionSet options);
322
328public:
329 static MIKTEXCORECEEAPI(std::ifstream) CreateInputStream(const MiKTeX::Util::PathName& path, std::ios_base::openmode mode, std::ios_base::iostate exceptions);
330
334public:
335 static std::ifstream CreateInputStream(const MiKTeX::Util::PathName& path)
336 {
337 return CreateInputStream(path, std::ios_base::in, std::ios_base::badbit);
338 }
339
345public:
346 static MIKTEXCORECEEAPI(std::ofstream) CreateOutputStream(const MiKTeX::Util::PathName& path, std::ios_base::openmode mode, std::ios_base::iostate exceptions);
347
352public:
353 static std::ofstream CreateOutputStream(const MiKTeX::Util::PathName& path, std::ios_base::openmode mode)
354 {
355 return CreateOutputStream(path, mode, std::ios_base::badbit | std::ios_base::failbit);
356 }
357
361public:
362 static std::ofstream CreateOutputStream(const MiKTeX::Util::PathName& path)
363 {
364 return CreateOutputStream(path, std::ios_base::out, std::ios_base::badbit | std::ios_base::failbit);
365 }
366
371public:
372 static MIKTEXCORECEEAPI(void) SetAttributes(const MiKTeX::Util::PathName& path, FileAttributeSet attributes);
373
378public:
379 static MIKTEXCORECEEAPI(void) SetNativeAttributes(const MiKTeX::Util::PathName& path, unsigned long nativeAttributes);
380
386public:
387 static MIKTEXCORECEEAPI(void) SetTimes(int fd, time_t creationTime, time_t lastAccessTime, time_t lastWriteTime);
388
394public:
395 static MIKTEXCORECEEAPI(void) SetTimes(FILE* file, time_t creationTime, time_t lastAccessTime, time_t lastWriteTime);
396
402public:
403 static MIKTEXCORECEEAPI(void) SetTimes(const MiKTeX::Util::PathName& path, time_t creationTime, time_t lastAccessTime, time_t lastWriteTime);
404
410public:
411 static MIKTEXCORECEEAPI(void) GetTimes(const MiKTeX::Util::PathName& path, time_t& creationTime, time_t& lastAccessTime, time_t& lastWriteTime);
412
418public:
419 static time_t GetLastWriteTime(const MiKTeX::Util::PathName& path)
420 {
421 time_t creationTime;
422 time_t lastAccessTime;
423 time_t lastWriteTime;
424 GetTimes(path, creationTime, lastAccessTime, lastWriteTime);
425 return lastWriteTime;
426 }
427
431public:
432 static MIKTEXCORECEEAPI(std::vector<unsigned char>) ReadAllBytes(const MiKTeX::Util::PathName& path);
433
437public:
438 static MIKTEXCORECEEAPI(void) WriteBytes(const MiKTeX::Util::PathName& path, const std::vector<unsigned char>& data);
439
441public:
442 enum class LockType
443 {
445 Shared,
447 Exclusive
448 };
449
455public:
456 static MIKTEXCORECEEAPI(bool) TryLock(int fd, LockType lockType, std::chrono::milliseconds timeout);
457
463public:
464 static bool TryLock(FILE* file, LockType lockType, std::chrono::milliseconds timeout)
465 {
466 return TryLock(fileno(file), lockType, timeout);
467 }
468
469#if defined(MIKTEX_WINDOWS)
475public:
476 static MIKTEXCORECEEAPI(bool) TryLock(HANDLE hFile, LockType lockType, std::chrono::milliseconds timeout);
477#endif
478
481public:
482 static MIKTEXCORECEEAPI(void) Unlock(int fd);
483
486public:
487 static void Unlock(FILE* file)
488 {
489 Unlock(fileno(file));
490 }
491
492#if defined(MIKTEX_WINDOWS)
495public:
496 static MIKTEXCORECEEAPI(void) Unlock(HANDLE hFile);
497#endif
498};
499
500MIKTEX_CORE_END_NAMESPACE;
501
502#if defined(_MSC_VER)
503#pragma warning(pop)
504#endif
505
506#endif
Directory class.
Definition: Directory.h:55
Definition: File.h:172
static void Copy(const MiKTeX::Util::PathName &source, const MiKTeX::Util::PathName &dest)
Definition: File.h:260
static void SetAttributes(const MiKTeX::Util::PathName &path, FileAttributeSet attributes)
static void SetNativeAttributes(const MiKTeX::Util::PathName &path, unsigned long nativeAttributes)
static bool Equals(const MiKTeX::Util::PathName &path1, const MiKTeX::Util::PathName &path2)
static bool IsSymbolicLink(const MiKTeX::Util::PathName &path)
static FILE * Open(const MiKTeX::Util::PathName &path, FileMode mode, FileAccess access, bool isTextFile, FileOpenOptionSet options)
static std::ofstream CreateOutputStream(const MiKTeX::Util::PathName &path)
Definition: File.h:362
static void SetTimes(const MiKTeX::Util::PathName &path, time_t creationTime, time_t lastAccessTime, time_t lastWriteTime)
static void GetTimes(const MiKTeX::Util::PathName &path, time_t &creationTime, time_t &lastAccessTime, time_t &lastWriteTime)
static FileAttributeSet GetAttributes(const MiKTeX::Util::PathName &path)
static size_t SetMaxOpen(size_t newMax)
static void Move(const MiKTeX::Util::PathName &source, const MiKTeX::Util::PathName &dest, FileMoveOptionSet option)
static std::ofstream CreateOutputStream(const MiKTeX::Util::PathName &path, std::ios_base::openmode mode)
Definition: File.h:353
LockType
File lock type.
Definition: File.h:443
static void Move(const MiKTeX::Util::PathName &source, const MiKTeX::Util::PathName &dest)
Definition: File.h:244
static void SetTimes(FILE *file, time_t creationTime, time_t lastAccessTime, time_t lastWriteTime)
static void Delete(const MiKTeX::Util::PathName &path)
static std::ofstream CreateOutputStream(const MiKTeX::Util::PathName &path, std::ios_base::openmode mode, std::ios_base::iostate exceptions)
static void Copy(const MiKTeX::Util::PathName &source, const MiKTeX::Util::PathName &dest, FileCopyOptionSet options)
static bool TryLock(int fd, LockType lockType, std::chrono::milliseconds timeout)
static void Unlock(HANDLE hFile)
static void SetTimes(int fd, time_t creationTime, time_t lastAccessTime, time_t lastWriteTime)
static std::ifstream CreateInputStream(const MiKTeX::Util::PathName &path, std::ios_base::openmode mode, std::ios_base::iostate exceptions)
static void WriteBytes(const MiKTeX::Util::PathName &path, const std::vector< unsigned char > &data)
static FILE * Open(const MiKTeX::Util::PathName &path, FileMode mode, FileAccess access)
static std::vector< unsigned char > ReadAllBytes(const MiKTeX::Util::PathName &path)
static std::ifstream CreateInputStream(const MiKTeX::Util::PathName &path)
Definition: File.h:335
static void Delete(const MiKTeX::Util::PathName &path, FileDeleteOptionSet options)
static time_t GetLastWriteTime(const MiKTeX::Util::PathName &path)
Definition: File.h:419
static MiKTeX::Util::PathName ReadSymbolicLink(const MiKTeX::Util::PathName &path)
static void Unlock(FILE *file)
Definition: File.h:487
static bool TryLock(HANDLE hFile, LockType lockType, std::chrono::milliseconds timeout)
static void CreateLink(const MiKTeX::Util::PathName &oldName, const MiKTeX::Util::PathName &newName, CreateLinkOptionSet options)
static bool Exists(const MiKTeX::Util::PathName &path)
static unsigned long GetNativeAttributes(const MiKTeX::Util::PathName &path)
static std::size_t GetSize(const MiKTeX::Util::PathName &path)
static void Unlock(int fd)
static bool Exists(const MiKTeX::Util::PathName &path, FileExistsOptionSet options)
static FILE * Open(const MiKTeX::Util::PathName &path, FileMode mode, FileAccess access, bool isTextFile)
static bool TryLock(FILE *file, LockType lockType, std::chrono::milliseconds timeout)
Definition: File.h:464
Definition: OptionSet.h:37
Instances of this class can be used to store path names.
Definition: PathName.h:73
FileAccess
File access options.
Definition: File.h:72
@ ReadWrite
Read/Write access.
FileExistsOption
Options for checking file existance.
Definition: File.h:161
@ SymbolicLink
Follow symbolic links.
FileMoveOption
Options for renaming (moving) a file.
Definition: File.h:124
FileMode
How to open a file.
Definition: File.h:54
@ CreateNew
The file will be created. Raise an error, if the file already exists.
@ Create
The file will be created, if it doesn't already exist.
@ Open
Open an existing file.
@ Command
Execute a command and create a pipe.
FileOpenOption
Options for opening a file.
Definition: File.h:103
@ DeleteOnClose
Delete the file when it is closed.
FileCopyOption
Options for copying a file.
Definition: File.h:135
CreateLinkOption
Options for creating a link.
Definition: File.h:148
@ Symbolic
Indicates wheter this is a symbolic link or a hard link.
@ ReplaceExisting
Replace an existing directory.
@ UpdateFndb
Update the file name database.
FileAttribute
File attributes.
Definition: File.h:84
@ ReadOnly
File is read-only.
@ Executable
File is executable.
FileDeleteOption
Options for deleting a file.
Definition: File.h:113
@ TryHard
Try hard to make the file go away.