+ [dev_t] public ulong st_rdev; // device type (if inode device)
+ [off_t] public long st_size; // total size, in bytes
+ [blksize_t] public long st_blksize; // blocksize for filesystem I/O
+ [blkcnt_t] public long st_blocks; // number of blocks allocated
+ [time_t] public long st_atime; // time of last access
+ [time_t] public long st_mtime; // time of last modification
+ [time_t] public long st_ctime; // time of last status change
+
+ public override int GetHashCode ()
+ {
+ return st_dev.GetHashCode () ^
+ st_ino.GetHashCode () ^
+ st_mode.GetHashCode () ^
+ st_nlink.GetHashCode () ^
+ st_uid.GetHashCode () ^
+ st_gid.GetHashCode () ^
+ st_rdev.GetHashCode () ^
+ st_size.GetHashCode () ^
+ st_blksize.GetHashCode () ^
+ st_blocks.GetHashCode () ^
+ st_atime.GetHashCode () ^
+ st_mtime.GetHashCode () ^
+ st_ctime.GetHashCode ();
+ }
+
+ public override bool Equals (object obj)
+ {
+ if (obj == null || obj.GetType() != GetType ())
+ return false;
+ Stat value = (Stat) obj;
+ return value.st_dev == st_dev &&
+ value.st_ino == st_ino &&
+ value.st_mode == st_mode &&
+ value.st_nlink == st_nlink &&
+ value.st_uid == st_uid &&
+ value.st_gid == st_gid &&
+ value.st_rdev == st_rdev &&
+ value.st_size == st_size &&
+ value.st_blksize == st_blksize &&
+ value.st_blocks == st_blocks &&
+ value.st_atime == st_atime &&
+ value.st_mtime == st_mtime &&
+ value.st_ctime == st_ctime;
+ }
+
+ public bool Equals (Stat value)
+ {
+ return value.st_dev == st_dev &&
+ value.st_ino == st_ino &&
+ value.st_mode == st_mode &&
+ value.st_nlink == st_nlink &&
+ value.st_uid == st_uid &&
+ value.st_gid == st_gid &&
+ value.st_rdev == st_rdev &&
+ value.st_size == st_size &&
+ value.st_blksize == st_blksize &&
+ value.st_blocks == st_blocks &&
+ value.st_atime == st_atime &&
+ value.st_mtime == st_mtime &&
+ value.st_ctime == st_ctime;
+ }
+
+ public static bool operator== (Stat lhs, Stat rhs)
+ {
+ return lhs.Equals (rhs);
+ }
+
+ public static bool operator!= (Stat lhs, Stat rhs)
+ {
+ return !lhs.Equals (rhs);
+ }