diff options
Diffstat (limited to 'js/file_info.ts')
-rw-r--r-- | js/file_info.ts | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/js/file_info.ts b/js/file_info.ts new file mode 100644 index 000000000..00e68ac91 --- /dev/null +++ b/js/file_info.ts @@ -0,0 +1,108 @@ +// Copyright 2018 the Deno authors. All rights reserved. MIT license. +import * as msg from "gen/msg_generated"; + +/** + * A FileInfo describes a file and is returned by `stat`, `lstat`, + * `statSync`, `lstatSync`. + */ +export interface FileInfo { + readonly _isFile: boolean; + readonly _isSymlink: boolean; + /** The size of the file, in bytes. */ + len: number; + /** + * The last modification time of the file. This corresponds to the `mtime` + * field from `stat` on Unix and `ftLastWriteTime` on Windows. This may not + * be available on all platforms. + */ + modified: number | null; + /** + * The last access time of the file. This corresponds to the `atime` + * field from `stat` on Unix and `ftLastAccessTime` on Windows. This may not + * be available on all platforms. + */ + accessed: number | null; + /** + * The last access time of the file. This corresponds to the `birthtime` + * field from `stat` on Unix and `ftCreationTime` on Windows. This may not + * be available on all platforms. + */ + created: number | null; + /** + * The underlying raw st_mode bits that contain the standard Unix permissions + * for this file/directory. TODO Match behavior with Go on windows for mode. + */ + mode: number | null; + + /** + * Returns the file or directory name. + */ + name: string | null; + + /** Returns the file or directory path. */ + path: string | null; + + /** + * Returns whether this is info for a regular file. This result is mutually + * exclusive to `FileInfo.isDirectory` and `FileInfo.isSymlink`. + */ + isFile(): boolean; + + /** + * Returns whether this is info for a regular directory. This result is + * mutually exclusive to `FileInfo.isFile` and `FileInfo.isSymlink`. + */ + isDirectory(): boolean; + + /** + * Returns whether this is info for a symlink. This result is + * mutually exclusive to `FileInfo.isFile` and `FileInfo.isDirectory`. + */ + isSymlink(): boolean; +} + +export class FileInfoImpl implements FileInfo { + readonly _isFile: boolean; + readonly _isSymlink: boolean; + len: number; + modified: number | null; + accessed: number | null; + created: number | null; + mode: number | null; + name: string | null; + path: string | null; + + /* @internal */ + constructor(private _inner: msg.StatRes) { + const modified = this._inner.modified().toFloat64(); + const accessed = this._inner.accessed().toFloat64(); + const created = this._inner.created().toFloat64(); + const hasMode = this._inner.hasMode(); + const mode = this._inner.mode(); // negative for invalid mode (Windows) + const name = this._inner.name(); + const path = this._inner.path(); + + this._isFile = this._inner.isFile(); + this._isSymlink = this._inner.isSymlink(); + this.len = this._inner.len().toFloat64(); + this.modified = modified ? modified : null; + this.accessed = accessed ? accessed : null; + this.created = created ? created : null; + // null on Windows + this.mode = hasMode ? mode : null; + this.name = name ? name : null; + this.path = path ? path : null; + } + + isFile() { + return this._isFile; + } + + isDirectory() { + return !this._isFile && !this._isSymlink; + } + + isSymlink() { + return this._isSymlink; + } +} |