Как я могу выбрать удаление пользователем всех файлов в папке (но без подкаталогов)?

2

У меня есть путь к папке. Папка содержит много файлов, а также некоторые подпапки. Я хочу, чтобы пользователь удалял файлы (но не папки), используя стандартный диалог Windows.

В настоящее время я использую этот код, который удаляет всю папку.

Microsoft.VisualBasic.FileIO.FileSystem.DeleteDirectory (
    path,
    UIOption.AllDialogs,
    RecycleOption.SendToRecycleBin,
    UICancelOption.DoNothing);

Я знаю, что могу перечислять все файлы и запрашивать пользователя для каждого файла, но это не совсем практично.

Теги:
file-io

2 ответа

2
Лучший ответ

Почему бы просто написать функцию для этой конкретной задачи?

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);
  • 0
    Я уже знаю путь, нет необходимости, чтобы пользователь выбирал его снова. File.Delete() не удаляется в корзину. Кроме того, я хотел бы предложить пользователю принять «удаление 497 файлов?» используя стандартный диалог Windows.
  • 0
    Просто добавьте второе диалоговое окно YesNo с надписью «Вы уверены, что хотите удалить» + dir.GetFiles (). Count + «?» сообщение после выбора вашего каталога.
Показать ещё 3 комментария
1

Visual Basic использует функцию API SHFileOperation() для отображения диалогового окна. Я думаю, вы можете назвать это самостоятельно и настроить его так, как вы хотите, указав флаг FOF_FILESONLY для члена SHFILEOPSTRUCT.fFlags. P/Invoke является серьезным, посетите pinvoke.net для объявлений.

  • 0
    Я боялся, что ты скажешь это. Ну, я посмотрю ...
  • 0
    вот операция SHFileOperation для копирования файлов stackoverflow.com/questions/8722907/… вы можете изменить флаги FILEOP_FLAGS_ENUM на такие, как FOF_WANTNUKEWARNING и FOF_NORECURSION или FOF_FILESONLY. Вы должны получить диалоговое окно подтверждения, если вы не используете FOF_NOERRORUI

Ещё вопросы

Сообщество Overcoder
Наверх
Меню