using System.IO; namespace Vanara.RunTimeLib { /// Extension methods for CRT enumerations to convert to .NET enumerations. public static class ConstantConversionExtensions { /// Converts a value to . /// The value. /// The result. public static FileAccess ToFileAccess(this FileAttributeConstant value) { // Note: This is not done in a switch because the order of tests matters. if ((FileAttributeConstant._A_RDONLY | FileAttributeConstant._A_NORMAL) == (value & (FileAttributeConstant._A_RDONLY | FileAttributeConstant._A_NORMAL))) return FileAccess.ReadWrite; else if (0 != (value & FileAttributeConstant._A_RDONLY)) return FileAccess.Read; else if (0 != (value & FileAttributeConstant._A_NORMAL)) return FileAccess.Write; else return FileAccess.Read; } /// Converts a value to . /// The value. /// The result. public static FileAccess ToFileAccess(this FilePermissionConstant value) { // Note: This is not done in a switch because the order of tests matters. if ((value & (FilePermissionConstant._S_IWRITE | FilePermissionConstant._S_IREAD)) != 0) return FileAccess.ReadWrite; else if ((value & FilePermissionConstant._S_IWRITE) != 0) return FileAccess.Write; else return FileAccess.Read; } /// Converts a value to . /// The value. /// The result. public static FileAttributes ToFileAttributes(this FileAttributeConstant value) { FileAttributes ret = 0; if ((value & FileAttributeConstant._A_SUBDIR) != 0) ret |= FileAttributes.Directory; if ((value & FileAttributeConstant._A_RDONLY) != 0) ret |= FileAttributes.ReadOnly; if ((value & FileAttributeConstant._A_HIDDEN) != 0) ret |= FileAttributes.Hidden; if ((value & FileAttributeConstant._A_SYSTEM) != 0) ret |= FileAttributes.System; if ((value & FileAttributeConstant._A_ARCH) != 0) ret |= FileAttributes.Archive; return ret; } /// Converts a value to . /// The value. /// The result. public static FileMode ToFileMode(this FileOpConstant value) { // Note: This is not done in a switch because the order of tests matters. if ((FileOpConstant._O_CREAT | FileOpConstant._O_EXCL) == (value & (FileOpConstant._O_CREAT | FileOpConstant._O_EXCL))) return FileMode.CreateNew; else if ((FileOpConstant._O_CREAT | FileOpConstant._O_TRUNC) == (value & (FileOpConstant._O_CREAT | FileOpConstant._O_TRUNC))) return FileMode.OpenOrCreate; else if (0 != (value & FileOpConstant._O_APPEND)) return FileMode.Append; else if (0 != (value & FileOpConstant._O_CREAT)) return FileMode.Create; else if (0 != (value & FileOpConstant._O_RDWR)) return FileMode.Open; else if (0 != (value & FileOpConstant._O_TRUNC)) return FileMode.Truncate; else return FileMode.OpenOrCreate; // This seemed the safest way to handled unrecognized types } /// Converts a value to . /// The value. /// The result. public static FileOptions ToFileOptions(this FileOpConstant value) { FileOptions ret = 0; if ((value & FileOpConstant._O_RANDOM) != 0) ret |= FileOptions.RandomAccess; if ((value & FileOpConstant._O_TEMPORARY) != 0) ret |= FileOptions.DeleteOnClose; if ((value & FileOpConstant._O_SEQUENTIAL) != 0) ret |= FileOptions.SequentialScan; return ret; } /// Converts a value to . /// The value. /// The result. public static FileShare ToFileShare(this FileAttributeConstant value) { // Note: This is not done in a switch because the order of tests matters. if ((FileAttributeConstant._A_RDONLY | FileAttributeConstant._A_NORMAL) == (value & (FileAttributeConstant._A_RDONLY | FileAttributeConstant._A_NORMAL))) return FileShare.ReadWrite; else if (0 != (value & FileAttributeConstant._A_RDONLY)) return FileShare.Read; else if (0 != (value & FileAttributeConstant._A_NORMAL)) return FileShare.Write; else return FileShare.Read; } /// Converts a value to . /// The value. /// The result. public static FileShare ToFileShare(this FilePermissionConstant value) { // Note: This is not done in a switch because the order of tests matters. if ((value & (FilePermissionConstant._S_IWRITE | FilePermissionConstant._S_IREAD)) != 0) return FileShare.ReadWrite; else if ((value & FilePermissionConstant._S_IWRITE) != 0) return FileShare.Write; else return FileShare.Read; } } }