У меня есть путь к папке. Папка содержит много файлов, а также некоторые подпапки. Я хочу, чтобы пользователь удалял файлы (но не папки), используя стандартный диалог Windows.
В настоящее время я использую этот код, который удаляет всю папку.
Microsoft.VisualBasic.FileIO.FileSystem.DeleteDirectory (
path,
UIOption.AllDialogs,
RecycleOption.SendToRecycleBin,
UICancelOption.DoNothing);
Я знаю, что могу перечислять все файлы и запрашивать пользователя для каждого файла, но это не совсем практично.
Почему бы просто написать функцию для этой конкретной задачи?
public static void DeleteFilesInFolder()
{
using(var dlg = new FolderBrowserDialog())
{
if(dlg.ShowDialog() == DialogResult.OK)
{
var folderPath = dlg.SelectedPath;
var dir = new DirectoryInfo(folderPath);
var files =dir.GetFiles();
foreach (var f in files)
{
try
{
f.Delete();
}
catch (Exception ex) {
//handle this error
}
}
}
}
}
ah ok, просто предложение..
то посмотрите на это:
http://www.blackwasp.co.uk/RecycleBin2.aspx
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEOPSTRUCT
{
public IntPtr hwnd;
public uint wFunc;
public string pFrom;
public string pTo;
public ushort fFlags;
public int fAnyOperationsAborted;
public IntPtr hNameMappings;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpszProgressTitle;
}
private const int FO_DELETE = 0x0003;
private const int FOF_SILENT = 0x0004;
private const int FOF_ALLOWUNDO = 0x0040;
private const int FOF_NOCONFIRMATION = 0x0010;
private const int FOF_WANTNUKEWARNING = 0x4000;
[DllImport("Shell32.dll")]
static extern int SHFileOperation([In] ref SHFILEOPSTRUCT lpFileOp);
используется для удаления всех файлов, соответствующих шаблону *.*
в папке:
SHFILEOPSTRUCT operation = new SHFILEOPSTRUCT();
operation.wFunc = FO_DELETE;
operation.pFrom = @"c:\Recycle\*.*" + "\0\0";
operation.fFlags = FOF_ALLOWUNDO;
int result = SHFileOperation(ref operation);
Visual Basic использует функцию API SHFileOperation() для отображения диалогового окна. Я думаю, вы можете назвать это самостоятельно и настроить его так, как вы хотите, указав флаг FOF_FILESONLY для члена SHFILEOPSTRUCT.fFlags. P/Invoke является серьезным, посетите pinvoke.net для объявлений.
File.Delete()
не удаляется в корзину. Кроме того, я хотел бы предложить пользователю принять «удаление 497 файлов?» используя стандартный диалог Windows.