FileSystem.hx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package asys;
  2. import haxe.Error;
  3. import haxe.io.Bytes;
  4. import haxe.io.FilePath;
  5. import asys.io.FileReadStream;
  6. typedef FileReadStreamCreationOptions = {
  7. ?flags:FileOpenFlags,
  8. ?mode:FilePermissions
  9. } &
  10. asys.io.FileReadStream.FileReadStreamOptions;
  11. class FileSystem {
  12. public static inline final async = asys.AsyncFileSystem;
  13. extern public static function access(path:FilePath, ?mode:FileAccessMode = FileAccessMode.Ok):Void;
  14. extern public static function chmod(path:FilePath, mode:FilePermissions, ?followSymLinks:Bool = true):Void;
  15. extern public static function chown(path:FilePath, uid:Int, gid:Int, ?followSymLinks:Bool = true):Void;
  16. extern public static function copyFile(src:FilePath, dest:FilePath, ?flags:FileCopyFlags):Void;
  17. public static function createReadStream(path:FilePath, ?options:FileReadStreamCreationOptions):FileReadStream {
  18. if (options == null)
  19. options = {};
  20. return new FileReadStream(open(path, options.flags, options.mode), options);
  21. }
  22. // static function createWriteStream(path:FilePath, ?options:{?flags:FileOpenFlags, ?mode:FilePermissions, ?autoClose:Bool, ?start:Int}):FileWriteStream;
  23. extern public static function exists(path:FilePath):Bool;
  24. extern public static function link(existingPath:FilePath, newPath:FilePath):Void;
  25. extern static function mkdir_native(path:FilePath, mode:FilePermissions):Void;
  26. public static function mkdir(path:FilePath, ?recursive:Bool = false, ?mode:FilePermissions):Void {
  27. if (mode == null)
  28. mode = @:privateAccess new FilePermissions(511); // 0777
  29. if (!recursive)
  30. return mkdir_native(path, mode);
  31. var pathBuffer:FilePath = null;
  32. for (component in path.components) {
  33. if (pathBuffer == null)
  34. pathBuffer = component;
  35. else
  36. pathBuffer = pathBuffer / component;
  37. try {
  38. mkdir_native(pathBuffer, mode);
  39. } catch (e:Error) {
  40. if (e.type.match(UVError(asys.uv.UVErrorType.EEXIST)))
  41. continue;
  42. throw e;
  43. }
  44. }
  45. }
  46. extern public static function mkdtemp(prefix:FilePath):FilePath;
  47. public static function readdir(path:FilePath):Array<FilePath> {
  48. return readdirTypes(path).map(entry -> entry.name);
  49. }
  50. extern public static function readdirTypes(path:FilePath):Array<DirectoryEntry>;
  51. extern public static function readlink(path:FilePath):FilePath;
  52. extern public static function realpath(path:FilePath):FilePath;
  53. extern public static function rename(oldPath:FilePath, newPath:FilePath):Void;
  54. extern public static function rmdir(path:FilePath):Void;
  55. extern public static function stat(path:FilePath, ?followSymLinks:Bool = true):eval.uv.Stat;
  56. extern public static function symlink(target:FilePath, path:FilePath, ?type:SymlinkType = SymlinkType.SymlinkDir):Void;
  57. public static function truncate(path:FilePath, ?len:Int = 0):Void {
  58. var f = open(path, FileOpenFlags.ReadWrite);
  59. try {
  60. f.truncate(len);
  61. } catch (e:Dynamic) {
  62. f.close();
  63. throw e;
  64. }
  65. f.close();
  66. }
  67. extern public static function unlink(path:FilePath):Void;
  68. extern static function utimes_native(path:FilePath, atime:Float, mtime:Float):Void;
  69. public static function utimes(path:FilePath, atime:Date, mtime:Date):Void {
  70. utimes_native(path, atime.getTime(), mtime.getTime());
  71. }
  72. public static inline function watch(path:FilePath, ?recursive:Bool = false):FileWatcher {
  73. return @:privateAccess new FileWatcher(path, recursive);
  74. }
  75. extern static function open_native(path:FilePath, flags:FileOpenFlags, mode:FilePermissions, binary:Bool):asys.io.File;
  76. public static function open(path:FilePath, ?flags:FileOpenFlags = FileOpenFlags.ReadOnly, ?mode:FilePermissions, ?binary:Bool = true):asys.io.File {
  77. if (mode == null)
  78. mode = @:privateAccess new FilePermissions(438); // 0666
  79. return open_native(path, flags, mode, binary);
  80. }
  81. public static function readFile(path:FilePath, ?flags:FileOpenFlags = FileOpenFlags.ReadOnly):Bytes {
  82. var file = open(path, flags);
  83. var buffer:haxe.io.Bytes;
  84. try {
  85. var size = file.stat().size;
  86. buffer = Bytes.alloc(size);
  87. file.readBuffer(buffer, 0, size, 0);
  88. } catch (e:Dynamic) {
  89. file.close();
  90. throw e;
  91. }
  92. file.close();
  93. return buffer;
  94. }
  95. @:access(asys.FileOpenFlags)
  96. public static function writeFile(path:FilePath, data:Bytes, ?flags:FileOpenFlags, ?mode:FilePermissions):Void {
  97. if (flags == null)
  98. flags = "w";
  99. if (mode == null)
  100. mode = @:privateAccess new FilePermissions(438) /* 0666 */;
  101. var file = open(path, flags, mode);
  102. var offset = 0;
  103. var length = data.length;
  104. var position:Null<Int> = null;
  105. if (flags.get_raw() & FileOpenFlags.Append.get_raw() == 0)
  106. position = 0;
  107. try {
  108. while (length > 0) {
  109. var written = file.writeBuffer(data, offset, length, position).bytesWritten;
  110. offset += written;
  111. length -= written;
  112. if (position != null) {
  113. position += written;
  114. }
  115. }
  116. file.close();
  117. } catch (e:Dynamic) {
  118. file.close();
  119. throw e;
  120. }
  121. }
  122. }