Example #1
0
        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;
            }
        }
Example #2
0
        /// <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);
        }