public static string GenerateRecycleItemsByJson() { try { List <Dictionary <string, string> > RecycleItemList = new List <Dictionary <string, string> >(); foreach (ShellItem Item in RecycleBin.GetItems()) { try { Dictionary <string, string> PropertyDic = new Dictionary <string, string> { { "ActualPath", Item.FileSystemPath } }; try { PropertyDic.Add("DeleteTime", (Item.IShellItem as Shell32.IShellItem2).GetFileTime(Ole32.PROPERTYKEY.System.Recycle.DateDeleted).ToInt64().ToString()); } catch { PropertyDic.Add("DeleteTime", default(FILETIME).ToInt64().ToString()); } if (File.Exists(Item.FileSystemPath)) { PropertyDic.Add("StorageType", Enum.GetName(typeof(StorageItemTypes), StorageItemTypes.File)); if (Path.GetExtension(Item.Name).Equals(Item.FileInfo.Extension, StringComparison.OrdinalIgnoreCase)) { PropertyDic.Add("OriginPath", Item.Name); } else { PropertyDic.Add("OriginPath", Item.Name + Item.FileInfo.Extension); } } else if (Directory.Exists(Item.FileSystemPath)) { PropertyDic.Add("OriginPath", Item.Name); PropertyDic.Add("StorageType", Enum.GetName(typeof(StorageItemTypes), StorageItemTypes.Folder)); } else { continue; } RecycleItemList.Add(PropertyDic); } finally { Item.Dispose(); } } return(JsonSerializer.Serialize(RecycleItemList)); } catch (Exception ex) { LogTracer.Log(ex, $"An exception was threw in {nameof(GenerateRecycleItemsByJson)}"); return(string.Empty); } }
public static bool Restore(params string[] OriginPathList) { Dictionary <string, ShellItem> PathDic = new Dictionary <string, ShellItem>(); try { foreach (ShellItem Item in RecycleBin.GetItems()) { if (File.Exists(Item.FileSystemPath)) { if (Path.GetExtension(Item.Name).Equals(Item.FileInfo.Extension, StringComparison.OrdinalIgnoreCase)) { PathDic.TryAdd(Item.Name, Item); } else { PathDic.TryAdd(Item.Name + Item.FileInfo.Extension, Item); } } else if (Directory.Exists(Item.FileSystemPath)) { PathDic.TryAdd(Item.Name, Item); } } bool HasError = false; foreach (string OriginPath in OriginPathList) { if (PathDic.TryGetValue(OriginPath, out ShellItem SourceItem)) { Directory.CreateDirectory(Path.GetDirectoryName(SourceItem.Name)); if (File.Exists(SourceItem.FileSystemPath)) { File.Move(SourceItem.FileSystemPath, StorageController.GenerateUniquePath(OriginPath)); } else if (Directory.Exists(SourceItem.FileSystemPath)) { Directory.Move(SourceItem.FileSystemPath, StorageController.GenerateUniquePath(OriginPath)); } string ExtraInfoPath = Path.Combine(Path.GetDirectoryName(SourceItem.FileSystemPath), Path.GetFileName(SourceItem.FileSystemPath).Replace("$R", "$I")); if (File.Exists(ExtraInfoPath)) { File.Delete(ExtraInfoPath); } } else { HasError = true; } } return(!HasError); } catch (Exception ex) { LogTracer.Log(ex, $"An exception was threw in {nameof(Restore)}"); return(false); } finally { foreach (ShellItem Item in PathDic.Values) { Item.Dispose(); } } }
/// <summary> /// Find out what process(es) have a lock on the specified file. /// </summary> /// <param name="path">Path of the file.</param> /// <returns>Processes locking the file</returns> public static IReadOnlyList <Process> GetLockingProcesses(string path) { StringBuilder SessionKey = new StringBuilder(Guid.NewGuid().ToString()); if (RstrtMgr.RmStartSession(out uint SessionHandle, 0, SessionKey).Succeeded) { try { string[] ResourcesFileName = new string[] { path }; if (RstrtMgr.RmRegisterResources(SessionHandle, (uint)ResourcesFileName.Length, ResourcesFileName, 0, null, 0, null).Succeeded) { uint pnProcInfo = 0; //Note: there's a race condition here -- the first call to RmGetList() returns // the total number of process. However, when we call RmGetList() again to get // the actual processes this number may have increased. Win32Error Error = RstrtMgr.RmGetList(SessionHandle, out uint pnProcInfoNeeded, ref pnProcInfo, null, out _); if (Error == Win32Error.ERROR_MORE_DATA) { // Create an array to store the process results RstrtMgr.RM_PROCESS_INFO[] ProcessInfo = new RstrtMgr.RM_PROCESS_INFO[pnProcInfoNeeded]; pnProcInfo = pnProcInfoNeeded; // Get the list if (RstrtMgr.RmGetList(SessionHandle, out pnProcInfoNeeded, ref pnProcInfo, ProcessInfo, out _).Succeeded) { List <Process> LockProcesses = new List <Process>((int)pnProcInfo); // Enumerate all of the results and add them to the // list to be returned for (int i = 0; i < pnProcInfo; i++) { try { LockProcesses.Add(Process.GetProcessById(Convert.ToInt32(ProcessInfo[i].Process.dwProcessId))); } catch (Exception ex) { // catch the error -- in case the process is no longer running LogTracer.Log(ex, "Process is no longer running"); } } return(LockProcesses); } else { LogTracer.Log("Could not list processes locking resource"); return(new List <Process>(0)); } } else if (Error != Win32Error.ERROR_SUCCESS) { LogTracer.Log("Could not list processes locking resource. Failed to get size of result."); return(new List <Process>(0)); } else { LogTracer.Log("Unknown error"); return(new List <Process>(0)); } } else { LogTracer.Log("Could not register resource"); return(new List <Process>(0)); } } finally { RstrtMgr.RmEndSession(SessionHandle); } }