Paepoi

Paepoi » .NET Tips » .NET でゴミ箱を使う

.NET でゴミ箱を使う

Win32 SDK なら SendToRecycleBin という関数でゴミ箱に捨てることができた。
しかし .NET Framework はプラットホームに依存しないという大義名分があるため方法が用意されていない。

ように思われますが依存性バリバリな名前空間である Microsoft.VisualBasic に密かに用意されている。
別に P/Invoke を利用してもいいけど C# からでも IronPython からでも使えるので使ってしまえです。

Window に Drop したファイルをゴミ箱へ

FileSystem クラス (Microsoft.VisualBasic.FileIO)

VB.net からは My から辿れるけどやれることは同じである。
My.Computer.FileSystem オブジェクト

ココでは IronPython から使うコードを書きますが C# からでも解りやすいように。
ライブラリ参照として Microsoft.VisualBasic を追加する。
Microsoft.VisualBasic.FileIO 名前空間以下を利用する。
FileSystem.DeleteFile は static メソッドなのでインスタンス作成の必要は無い。
三番目の引数に RecycleOption 列挙体の SendToRecycleBin を指定する。
という感じで利用できます。

# -*- coding: UTF-8 -*-

import clr

clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")
# namespace Microsoft は PresentationCore にあるけど…
clr.AddReference("Microsoft.VisualBasic")

from System import *
from System.Windows import *
from Microsoft.VisualBasic.FileIO import *

class SendToRecycleBin(Window):
    """
        ファイルをドロップするとゴミ箱へ移動させる WPF Window
    """
    def __init__(self):
        self.Width = 320
        self.Height = 240
        self.Title = "SendToRecycleBin"
        self.AllowDrop = True
        self.Drop += self.on_drop

    def on_drop(self, sender, e):
        files = e.Data.GetData(DataFormats.FileDrop)
        for f in files:
            FileSystem.DeleteFile(
                    f,
                    UIOption.OnlyErrorDialogs,
                    RecycleOption.SendToRecycleBin
                )

if __name__ == "__main__":
    a = Application()
    a.Run(SendToRecycleBin())


と、たったこれだけのコードで複数ファイルドロップ対応のゴミ箱移動アプリが作れます。
Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.