1

たくさんの関数を備えたファイルブラウザを作成し、これを見つけるために私のメソッドのいくつかを微調整するために戻ってきました:

foreach (ListViewItem item in listView1.SelectedItems)
{
    FileSystem.DeleteDirectory(item.SubItems[3].Text,  
        UIOption.AllDialogs,
        RecycleOption.SendToRecycleBin,
        UICancelOption.ThrowException);
}

これは、SINGLEディレクトリまたはファイルをごみ箱に送信するのに最適ですが、選択したすべてのアイテムの入力を求められます。ファイルやフォルダの山を削除するのには適していません。

余分なプロンプトなしでこれを達成する方法はありますか?または、SHFILEOPSTRUCTを詳しく調べる必要がありますか?

あなたの助けに感謝します、これまでのところ私の質問の90%はすでにここで答えられました、これまでで最高のウェブサイト。

4

2 に答える 2

4

プロンプトが必要ない場合は、メソッドの代わりにDirectory.Deleteを使用できます。FileSystemこれにより、ディレクトリ、ファイル、およびサブディレクトリが削除されます(指定した場合)。

于 2012-05-16T22:32:37.873 に答える
0

これは、必要なことを実行する唯一の方法のようです。プロンプトなし
でファイルとディレクトリをごみ箱に移動します。

using System.Runtime.InteropServices;

class Win32ApiUtils
{
    // Don't declare a value for the Pack size. If you omit it, the correct value is used when  
    // marshaling and a single SHFILEOPSTRUCT can be used for both 32-bit and 64-bit operation.
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        [MarshalAs(UnmanagedType.U4)]
        public int wFunc;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pFrom;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pTo;            
        public ushort fFlags;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpszProgressTitle;
   }

   [DllImport("shell32.dll", CharSet = CharSet.Auto)]
   static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);
   const int FO_DELETE = 3;
   const int FOF_ALLOWUNDO = 0x40;
   const int FOF_NOCONFIRMATION = 0x10; //Don't prompt the user.; 

   public static int DeleteFilesToRecycleBin(string filename)
   {
        SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
        shf.wFunc = FO_DELETE;
        shf.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
        shf.pFrom = filename + "\0";  // <--- this "\0" is critical !!!!!
        int result = SHFileOperation(ref shf);
        // Any value different from zero is an error to lookup 
        return result;

   }

}

   foreach (ListViewItem item in listView1.SelectedItems)
   {
        int result = Win32ApiUtils.DeleteFilesToRecycleBin(item.SubItems[3].Text);
        if(result != 0) ...... // ??? throw ??? message to user and contine ???
   }

-警告- このコードはテストする必要があります。PInvokeサイトでSHFILEOPSTRUCTのレイアウトを見つけました。そのリンクには、使用されている文字列の宣言に関するメモがいくつかあります。

上手。削除する単一のディレクトリを使用して、Win764ビットでテストしました。チャームのように機能します。

于 2012-05-17T10:13:13.443 に答える