2013년 12월 17일 화요일

[Python] Windows CDRom Module

This module provides easy control of cd drives on Win32 machines. Using the Python Win32 Extensions, the module automatically detects all cd drives and defaults to the first drive found or to a programmer specified drive. Methods include eject() to open the drive door, close() to close the drive door, and load() which tries to close the drive door and then make the drive available to the file system.

To test either import the WinCDRom module and create an instance of the Cdrom class:

import WinCDRom
cd = WinCDRom.Cdrom()
cd.eject()
cd.close()
cd.load()

Or just run the script from a DOS prompt to use the test function:

C:\python WinCDRom.py

Listing drives:
['D:']
Default drive: D:
Opening drive door...
Closing cd drive door... (CD read attempt will time out at 5 seconds.)
Loaded cd successfully in drive D:
WinCDRom Tests completed.


소스코드:

'''
Python Module: WinCDROM
Purpose: Loads or unloads a cd-rom drive on Windows. Only
tested on Windows 2000 and XP.
'''

import os, time
try:
    import win32file, win32api
    from win32con import *
except ImportError:
    print "The WinCDROM module requires the Python Win32 extensions."
    raise

class Cdrom:
    '''Controls for loading,ejecting, and reading cds on Win32 platforms.'''

    def __init__(self, drive=None, timeout=20):
        '''Accepts a cd drive letter. For example 'E:' or 'e'.'''
        self.drives = []
        try:
            self.drive = drive[:1].upper()
        except TypeError:
            self.drive = ''
            self.getDrives()
        self.timeout = timeout

    def __getDeviceHandle(self, drive=''):
        '''Returns a properly formatted device handle for DeviceIOControl call.'''
        drive = drive[:1]
        return "\\\\.\\%s:" % drive.upper()

    def __is_cd_inserted(self, drive=''):
        try:
            x = win32api.GetVolumeInformation(drive)
            #print "CD is inserted in drive %s" % drive
            return 1
        except:
            #print "no CD inserted in drive %s" % drive
            return 0

    def getDrives(self):
        '''Assign all available cd drives to self.drives. If CdRom.drive
        is not already set the first drive returned becomes the default.
        '''
        letters = [l.upper() + ':' for l in 'abcdefghijklmnopqrstuvwxyz']
        for drive in letters:
            if win32file.GetDriveType(drive)==5:
                self.drives.append(drive)
        if not self.drive:
            self.drive = self.drives[0]

    def load(self, drive=''):
        '''Closes cd drive door and waits until cd is readable.'''
        drive = drive or self.drive
        device = self.__getDeviceHandle(drive)
        hdevice = win32file.CreateFile(device, GENERIC_READ,
                                        FILE_SHARE_READ, None, OPEN_EXISTING, 0, 0)
        win32file.DeviceIoControl(hdevice,2967564,"", 0, None)
        win32file.CloseHandle(hdevice)
        # Poll drive for loaded and give up after timeout period
        i=0
        while i < 20:
            if self.__is_cd_inserted(drive) == 1:
                return 1
            else:
                time.sleep(1)
            i = i+1
        return 0

    def eject(self, drive=''):
        '''Opens the cd drive door.'''
        drive = drive or self.drive
        device = self.__getDeviceHandle(drive)
        hdevice = win32file.CreateFile(device, GENERIC_READ,
                                        FILE_SHARE_READ, None, OPEN_EXISTING, 0, 0)
        win32file.DeviceIoControl(hdevice,2967560,"", 0, None)
        win32file.CloseHandle(hdevice)

    def close(self, drive=''):
        '''Closes the cd drive door.'''
        drive = drive or self.drive
        device = self.__getDeviceHandle(drive)
        hdevice = win32file.CreateFile(device, GENERIC_READ,
                                        FILE_SHARE_READ, None, OPEN_EXISTING, 0, 0)
        win32file.DeviceIoControl(hdevice,2967564,"", 0, None)
        win32file.CloseHandle(hdevice)
       
if __name__ == '__main__':
    cd = Cdrom(timeout=5)
    print "Running WinCDRom tests"; print
    print "Listing drives:"; print
    print cd.drives; print
    print "Default drive: %s" % cd.drive; print
    print "Opening drive door..."
    cd.eject(); print
    import time; time.sleep(2)
    print "Closing cd drive door... (CD read attempt will time out at %s seconds.)" % cd.timeout
    print
    if cd.load() == 1:
        print "Loaded cd successfully in drive %s" % cd.drive
        print
    else:
        print "Unable to load cd."
        print "If you have a slower drive try increasing the 'timeout' parameter."
        print
    print "WinCDRom Tests completed."

댓글 없음:

댓글 쓰기