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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

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

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
                    }
                }
                }
            }
        }

ну хорошо, просто предложение ..

тогда взгляните на это:

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);
1 голос
/ 19 февраля 2010

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

...