Datei: FileOperationAPIWrapper.cs using System.Runtime.InteropServices; // Wrapper-Class, to move,copy, delete files and folders // it use a method in the dll shell32.dll // method SHFileOperation public class FileOperationAPIWrapper { [Flags] public enum FileOperationFlags : ushort { /// /// Do not show a dialog during the process /// FOF_SILENT = 0x0004, /// /// Do not ask the user to confirm selection /// FOF_NOCONFIRMATION = 0x0010, /// /// Delete the file to the recycle bin. (Required flag to send a file to the bin /// FOF_ALLOWUNDO = 0x0040, /// /// Do not show the names of the files or folders that are being recycled. /// FOF_SIMPLEPROGRESS = 0x0100, /// /// Surpress errors, if any occur during the process. /// FOF_NOERRORUI = 0x0400, /// /// Warn if files are too big to fit in the recycle bin and will need /// to be deleted completely. /// FOF_WANTNUKEWARNING = 0x4000, } /// /// File Operation Function Type for SHFileOperation /// public enum FileOperationType : uint { /// /// Move the objects /// FO_MOVE = 0x0001, /// /// Copy the objects /// FO_COPY = 0x0002, /// /// Delete (or recycle) the objects /// FO_DELETE = 0x0003, /// /// Rename the object(s) /// FO_RENAME = 0x0004, } /// /// SHFILEOPSTRUCT for SHFileOperation from COM /// [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)] private struct SHFILEOPSTRUCT { public IntPtr hwnd; [MarshalAs(UnmanagedType.U4)] public FileOperationType wFunc; public string pFrom; public string pTo; public FileOperationFlags fFlags; [MarshalAs(UnmanagedType.Bool)] public bool fAnyOperationsAborted; public IntPtr hNameMappings; public string lpszProgressTitle; } // Link to the DLL-method [DllImport("shell32.dll", CharSet = CharSet.Auto)] private static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); /// /// call the DLL-method 'SHFileOperation' /// /// All durs and files with \0 /// path, in which then files are copied /// fileop: move, cut, copy /// FileOperationFlags to add in addition to FOF_ALLOWUNDO /// , FileOperationFlags flags public static bool FilesAction(string from, String to, FileOperationType fileop, FileOperationFlags flags) { try { var fs = new SHFILEOPSTRUCT { wFunc = fileop, pFrom = from + '\0' + '\0', pTo = to, fFlags = flags }; SHFileOperation(ref fs); return true; } catch (Exception) { return false; } } } Aufrufbeispiel: public void Copy() { insertSelectedFiles(FileOperationAPIWrapper.FileOperationType.FO_COPY); } public void Cut() { insertSelectedFiles(FileOperationAPIWrapper.FileOperationType.FO_MOVE); // update einer Liste } private void insertSelectedFiles(FileOperationAPIWrapper.FileOperationType action) { if (SelectedItems.Count > 0) { ArrayList liste = new ArrayList(); foreach (FileItem fitem in SelectedItems) { liste.Add(fitem.Fullname); } _middleware.insertSelectedFiles(liste, action); } else { MessageBox.Show("Sie haben keine Dateien/Verzeichnisse ausgewählt", "Hinweis", MessageBoxButton.OK, MessageBoxImage.Information); } } // insertSelectedFiles public void Paste() { FileOperationAPIWrapper.FileOperationType fileop; String actionFileString = ""; int action = _middleware.getSelectedFilesFromRegistry(out actionFileString); switch (action) { case 1: fileop = FileOperationAPIWrapper.FileOperationType.FO_MOVE; break; case 2: fileop = FileOperationAPIWrapper.FileOperationType.FO_COPY; break; default: return; // action=0 } FileOperationAPIWrapper.FilesAction(actionFileString, _actualPath, fileop, FileOperationAPIWrapper.FileOperationFlags.FOF_ALLOWUNDO); // Update } // Paste private String getSelectedFiles_Delete() { System.Collections.ICollection liste = SelectedItems; if (liste.Count > 0) { // foreach (ListViewItem selectedItem in fileTable.SelectedItems) { StringBuilder files = new StringBuilder(); foreach (FileItem fitem in SelectedItems) { files.Append(fitem.Fullname).Append("\0"); } return files.ToString(); } else { MessageBox.Show("Sie haben keine Dateien/Verzeichnisse ausgewählt", "Hinweis", MessageBoxButton.OK, MessageBoxImage.Information); return ""; } } // getSelectedFiles_Delete public void DeleteFiles(bool recycleBin) { FileOperationAPIWrapper.FileOperationType fileop = FileOperationAPIWrapper.FileOperationType.FO_DELETE; String actionFileString = getSelectedFiles_Delete(); if (actionFileString.Length > 0) { if (recycleBin) FileOperationAPIWrapper.FilesAction(actionFileString, _actualPath, fileop, FileOperationAPIWrapper.FileOperationFlags.FOF_ALLOWUNDO); else FileOperationAPIWrapper.FilesAction(actionFileString, _actualPath, fileop, 0); // Update } } // deleteFiles