using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; using System.Text; namespace Apewer.Internals { internal class NtfsUnlocker { #region Win32 [DllImport("kernel32.dll", CharSet = CharSet.Auto, BestFitMapping = false, ThrowOnUnmappableChar = true)] static extern int FormatMessage(int dwFlags, IntPtr lpSource, int dwMessageId, int dwLanguageId, StringBuilder lpBuffer, int nSize, IntPtr vaListArguments); [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] static extern int GetFileAttributes(string fileName); [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool DeleteFile(string name); #endregion public const string Postfix = ":Zone.Identifier"; public static bool FileExists(string path) => GetFileAttributes(path) != -1; public static string DeleteZoneIdentifier(string path) { if (!FileExists(path)) return "文件不存在。"; try { var info = new FileInfo(path); var streamPath = info.FullName + Postfix; var streamExists = FileExists(streamPath); if (!streamExists) return null; var deleted = DeleteFile(streamPath); if (!deleted) return $"未能删除 {streamPath}。"; return null; } catch (Exception ex) { return ex.Message; } } } }