読者です 読者をやめる 読者になる 読者になる

ドライブを一覧表示するコマンド

python

コマンドプロンプト上でLaTeXでPDFを作成し、それをUSBメモリにコピーする事が頻繁にあるのですが、USBメモリのパスはどれだったっけマイコンピュータを開くのが面倒くさい!というわけで、pywin32で作ってみました。当然、Windowsでしか動きません

#!python3
#encoding: shift-jis

#drives.py

import sys
from win32api import (
    GetLogicalDriveStrings,
    GetVolumeInformation,
)
from win32file import (
    GetDiskFreeSpaceEx,
    GetDriveType,
)
from win32con import (
    DRIVE_UNKNOWN,
    DRIVE_NO_ROOT_DIR, 
    DRIVE_REMOVABLE,
    DRIVE_FIXED,
    DRIVE_REMOTE,
    DRIVE_CDROM,
    DRIVE_RAMDISK,
)
import pywintypes

from os.path import normpath, normcase
import string

def print_table(table, *, file=None):
    if file is None:
        file = sys.stdout
    
    max_col_count = max(len(row) for row in table)
    
    def width(astr):
        return sum(len(c.encode("mbcs")) for c in astr)
    
    col_widths = [
        max(width(row[col_index]) for row in table)
            for col_index in range(max_col_count)]
    
    lines = 
    for row in table:
        for col_index, value in enumerate(row):
            value = value.encode("mbcs").ljust(col_widths[col_index]).decode("mbcs")
            print(value, file=file, end=" ")
        print(file=file)
    


def byte_size_to_string(byte_size):
    for i, unit_name in enumerate("B KB MB GB TB".split()):
        unit = 2 ** (i * 10)
        if byte_size < unit * 2**10:
            size_in_unit = byte_size // unit
            return "{}{}".format(size_in_unit, unit_name)
    else:
        peta = 2 ** 50
        return "{}PB".format(byte_size // peta)
    


def GetDriveTypeString(root_path):
    t = GetDriveType(root_path)
    if t == DRIVE_NO_ROOT_DIR:
        raise pywintypes.error("{} is not a drive root path".format(repr(root_path)))
    
    return {
        DRIVE_REMOVABLE: "リムーバブル",
        DRIVE_FIXED: "固定",
        DRIVE_REMOTE: "リモート",
        DRIVE_CDROM: "CD-ROM",
        DRIVE_RAMDISK: "RAMディスク",
    }.get(t, "不明")


def main():
    root_paths = GetLogicalDriveStrings().split("\x00")[:-1]
    root_paths = [p.upper() for p in root_paths]
    root_paths.sort()
    
    table = 
    for root_path in root_paths:
        try:
            drive_type = GetDriveTypeString(root_path)
        except pywintypes.error:
            continue
        
        try:
            volume_label, _, _, _, _ = GetVolumeInformation(root_path)
        except pywintypes.error:
            volume_label = "不明"
        
        try:
            available_size, total_size, _ = GetDiskFreeSpaceEx(root_path)
        except pywintypes.error:
            size = "不明"
        else:
            size = "{}/{}".format(
                byte_size_to_string(available_size),
                byte_size_to_string(total_size))
        
        table.append([
            "({})".format(root_path),
            volume_label,
            size,
            drive_type,
        ])
    
    print_table(table)

if "__main__" == __name__:
    main()

そもそも、標準でこういうコマンドがあるような気がしてなりません。

広告を非表示にする