You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
6.3KB

  1. #pragma once
  2. #include <vector>
  3. #include <common.hpp>
  4. namespace rack {
  5. /** Cross-platform functions for OS, file path, and filesystem routines */
  6. namespace system {
  7. // Filesystem
  8. /** Joins two paths with a directory separator.
  9. If `path2` is an empty string, returns `path1`.
  10. */
  11. std::string join(const std::string& path1, const std::string& path2 = "");
  12. /** Join an arbitrary number of paths, from left to right. */
  13. template <typename... Paths>
  14. std::string join(const std::string& path1, const std::string& path2, Paths... paths) {
  15. return join(join(path1, path2), paths...);
  16. }
  17. /** Returns all entries (directories, files, symbolic links, etc) in a directory.
  18. `depth` is the number of directories to recurse. 0 depth does not recurse. -1 depth recurses infinitely.
  19. */
  20. std::vector<std::string> getEntries(const std::string& dirPath, int depth = 0);
  21. bool exists(const std::string& path);
  22. /** Returns whether the given path is a file. */
  23. bool isFile(const std::string& path);
  24. /** Returns whether the given path is a directory. */
  25. bool isDirectory(const std::string& path);
  26. uint64_t getFileSize(const std::string& path);
  27. /** Moves a file or directory.
  28. Does not overwrite the destination. If this behavior is needed, use remove() or removeRecursively() before moving.
  29. Returns whether the rename was successful.
  30. */
  31. bool rename(const std::string& srcPath, const std::string& destPath);
  32. /** Copies a file or directory recursively.
  33. Overwrites destination if already exists.
  34. Returns whether the copy was successful.
  35. */
  36. bool copy(const std::string& srcPath, const std::string& destPath);
  37. /** Creates a directory.
  38. The parent directory must exist.
  39. Returns whether the creation was successful.
  40. */
  41. bool createDirectory(const std::string& path);
  42. /** Creates all directories up to the path.
  43. Returns whether the creation was successful.
  44. */
  45. bool createDirectories(const std::string& path);
  46. /** Deletes a file or empty directory.
  47. Returns whether the deletion was successful.
  48. */
  49. bool remove(const std::string& path);
  50. /** Deletes a file or directory recursively.
  51. Returns the number of files and directories that were deleted.
  52. */
  53. int removeRecursively(const std::string& path);
  54. std::string getWorkingDirectory();
  55. void setWorkingDirectory(const std::string& path);
  56. std::string getTempDirectory();
  57. /** Returns the absolute path beginning with "/". */
  58. std::string getAbsolute(const std::string& path);
  59. /** Returns the canonical (unique) path, following symlinks and "." and ".." fake directories.
  60. The path must exist on the filesystem.
  61. Examples:
  62. getCanonical("/foo/./bar/.") // "/foo/bar"
  63. */
  64. std::string getCanonical(const std::string& path);
  65. /** Extracts the parent directory of the path.
  66. Examples:
  67. getDirectory("/var/tmp/example.txt") // "/var/tmp"
  68. getDirectory("/") // ""
  69. getDirectory("/var/tmp/.") // "/var/tmp"
  70. */
  71. std::string getDirectory(const std::string& path);
  72. /** Extracts the filename of the path.
  73. Examples:
  74. getFilename("/foo/bar.txt") // "bar.txt"
  75. getFilename("/foo/.bar") // ".bar"
  76. getFilename("/foo/bar/") // "."
  77. getFilename("/foo/.") // "."
  78. getFilename("/foo/..") // ".."
  79. getFilename(".") // "."
  80. getFilename("..") // ".."
  81. getFilename("/") // "/"
  82. */
  83. std::string getFilename(const std::string& path);
  84. /** Extracts the portion of a filename without the extension.
  85. Examples:
  86. getStem("/foo/bar.txt") // "bar"
  87. getStem("/foo/.bar") // ""
  88. getStem("/foo/foo.tar.ztd") // "foo.tar"
  89. */
  90. std::string getStem(const std::string& path);
  91. /** Extracts the extension of a filename, including the dot.
  92. Examples:
  93. getExtension("/foo/bar.txt") // ".txt"
  94. getExtension("/foo/bar.") // "."
  95. getExtension("/foo/bar") // ""
  96. getExtension("/foo/bar.txt/bar.cc") // ".cc"
  97. getExtension("/foo/bar.txt/bar.") // "."
  98. getExtension("/foo/bar.txt/bar") // ""
  99. getExtension("/foo/.") // ""
  100. getExtension("/foo/..") // ""
  101. getExtension("/foo/.hidden") // ".hidden"
  102. */
  103. std::string getExtension(const std::string& path);
  104. // File read/write
  105. /** Reads an entire file into a memory buffer.
  106. Throws on error.
  107. */
  108. std::vector<uint8_t> readFile(const std::string& path);
  109. /** Writes a memory buffer to a file, overwriting if already exists.
  110. Throws on error.
  111. */
  112. void writeFile(const std::string& path, const std::vector<uint8_t>& data);
  113. /** Compresses the contents of a directory (recursively) to an archive.
  114. Uses the Unix Standard TAR + Zstandard format (.tar.zst).
  115. An equivalent shell command is
  116. tar -c -C dirPath . | zstd -1 -o archivePath
  117. or
  118. ZSTD_CLEVEL=1 tar -cf archivePath --zstd -C dirPath .
  119. Throws on error.
  120. */
  121. void archiveDirectory(const std::string& archivePath, const std::string& dirPath, int compressionLevel = 1);
  122. std::vector<uint8_t> archiveDirectory(const std::string& dirPath, int compressionLevel = 1);
  123. /** Extracts an archive into a directory.
  124. An equivalent shell command is
  125. zstd -d < archivePath | tar -x -C dirPath
  126. or
  127. tar -xf archivePath --zstd -C dirPath
  128. Throws on error.
  129. */
  130. void unarchiveToDirectory(const std::string& archivePath, const std::string& dirPath);
  131. void unarchiveToDirectory(const std::vector<uint8_t>& archiveData, const std::string& dirPath);
  132. // Threading
  133. /** Returns the number of logical simultaneous multithreading (SMT) (e.g. Intel Hyperthreaded) threads on the CPU. */
  134. int getLogicalCoreCount();
  135. /** Sets a name of the current thread for debuggers and OS-specific process viewers. */
  136. void setThreadName(const std::string& name);
  137. // Querying
  138. /** Returns the caller's human-readable stack trace with "\n"-separated lines. */
  139. std::string getStackTrace();
  140. /** Returns the number of seconds since application launch.
  141. Gives the most precise (fine-grained) time differences available on the OS for benchmarking purposes, while being fast to compute.
  142. */
  143. double getTime();
  144. /** Returns time since 1970-01-01 00:00:00 UTC in seconds.
  145. */
  146. double getUnixTime();
  147. double getThreadTime();
  148. std::string getOperatingSystemInfo();
  149. // Applications
  150. /** Opens a URL in a browser.
  151. Shell injection is possible, so make sure the URL is trusted or hard coded.
  152. Does nothing if string is blank.
  153. Does not block.
  154. */
  155. void openBrowser(const std::string& url);
  156. /** Opens Windows Explorer, Finder, etc at a directory location.
  157. Does nothing if string is blank.
  158. Does not block.
  159. */
  160. void openDirectory(const std::string& path);
  161. /** Runs an executable without blocking.
  162. The launched process will continue running if the current process is closed.
  163. */
  164. void runProcessDetached(const std::string& path);
  165. PRIVATE void init();
  166. } // namespace system
  167. } // namespace rack