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