public override void Eject() { IntPtr fileHandle = IntPtr.Zero; try { // Create an handle to the drive fileHandle = WindowsAPI.CreateFile(this.CreateDeviceIOPath, WindowsAPI.GENERICREAD, 0, IntPtr.Zero, WindowsAPI.OPENEXISTING, 0, IntPtr.Zero); if ((int)fileHandle != WindowsAPI.INVALID_HANDLE) { // Eject the disk uint returnedBytes; WindowsAPI.DeviceIoControl(fileHandle, WindowsAPI.IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero); } } catch { throw new Exception(Marshal.GetLastWin32Error().ToString()); } finally { // Close Drive Handle WindowsAPI.CloseHandle(fileHandle); fileHandle = IntPtr.Zero; } }
/// <summary> /// Creates a FileStream from the specified path, return NULL if fail. /// </summary> /// <param name="path"></param> /// <param name="mode"></param> /// <param name="access"></param> /// <param name="share"></param> /// <param name="bufferSize"></param> /// <param name="isAsync"></param> /// <returns></returns> public static FileStream CreateFileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, bool isAsync) { if (string.IsNullOrWhiteSpace(path)) { throw new ArgumentException("path is null or empty.", "path"); } WindowsAPI.FileAccessMode accessMode = WindowsAPI.FileAccessMode.None; switch (access) { case FileAccess.Read: accessMode = WindowsAPI.FileAccessMode.Read; break; case FileAccess.Write: accessMode = WindowsAPI.FileAccessMode.Write; break; case FileAccess.ReadWrite: accessMode = WindowsAPI.FileAccessMode.Read | WindowsAPI.FileAccessMode.Write; break; } WindowsAPI.FileShareMode shareMode = WindowsAPI.FileShareMode.None; switch (share) { case FileShare.Read: shareMode = WindowsAPI.FileShareMode.Read; break; case FileShare.Write: shareMode = WindowsAPI.FileShareMode.Write; break; case FileShare.ReadWrite: shareMode = WindowsAPI.FileShareMode.Read | WindowsAPI.FileShareMode.Write; break; case FileShare.Delete: shareMode = WindowsAPI.FileShareMode.Delete; break; } WindowsAPI.FileCreationMode creationMode = WindowsAPI.FileCreationMode.CreateAlways; switch (mode) { case FileMode.Create: creationMode = WindowsAPI.FileCreationMode.CreateAlways; break; case FileMode.CreateNew: creationMode = WindowsAPI.FileCreationMode.CreateNew; break; case FileMode.Open: case FileMode.Append: creationMode = WindowsAPI.FileCreationMode.OpenExisting; break; case FileMode.OpenOrCreate: creationMode = WindowsAPI.FileCreationMode.OpenAlways; break; case FileMode.Truncate: creationMode = WindowsAPI.FileCreationMode.TruncateExisting; break; } WindowsAPI.FileFlagAndAttribute flagAndAttribute = WindowsAPI.FileFlagAndAttribute.AttributeNormal; if (isAsync) { flagAndAttribute |= WindowsAPI.FileFlagAndAttribute.FlagOverlapped; } FileStream stream = null; IntPtr ptr = WindowsAPI.CreateFile(path, accessMode, shareMode, IntPtr.Zero, creationMode, flagAndAttribute, IntPtr.Zero); SafeFileHandle handle = new SafeFileHandle(ptr, true); if (!handle.IsInvalid) { stream = new FileStream(handle, access, bufferSize, isAsync); } else { handle.Dispose(); } return(stream); }