Vitokhv Asked:2020-01-02 01:29:20 +0000 UTC2020-01-02 01:29:20 +0000 UTC 2020-01-02 01:29:20 +0000 UTC 如何检查文件是否受保护? 772 从 Internet 下载文件时,它会以这种方式被标记为保护: 如何使用我的应用程序跟踪带有此保护标记的文件? 例如,将文件拖到应用程序上时。 c# 1 个回答 Voted Best Answer VladD 2020-01-02T02:05:08Z2020-01-02T02:05:08Z 最有可能的是,您只需要解锁文件以防它被锁定。 官方的方法是调用 Powershell-cmdlet Unblock-File。为此,请安装 nuget 包System.Management.Automation并使用以下代码: using (var ps = PowerShell.Create()) { ps.AddCommand("Unblock-File", true); ps.AddParameter("LiteralPath", fullPath); ps.Invoke(); } 替代方式 - 您可以使用在当前版本的 Windows 中有关锁定文件的数据包含在名为 Zone.Identifier 的替代 NTFS 数据流中的知识,并通过 P/Invoke 将其删除(从 en.SO 借来的代码): [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool DeleteFile(string name ); public bool Unblock(string fileName) { return DeleteFile(fileName + ":Zone.Identifier"); } 好的,如果您真的只需要检查是否有保护,则必须使用 COM 对象。PersistentZoneIdentifier COM 对象负责阻塞。代码从这里和这里借来,并进行了改编。 using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; static class BlockChecker { public static bool IsBlocked(string path) { object persistZoneId = Activator.CreateInstance( Type.GetTypeFromCLSID(Guid.Parse(CLSID_PersistentZoneIdentifier))); var zoneIdentifier = (IZoneIdentifier)persistZoneId; var persistFile = (IPersistFile)persistZoneId; try { persistFile.Load(path, 0); // STGM_READ var id = zoneIdentifier.GetId(); return id == URLZONE.URLZONE_INTERNET || id == URLZONE.URLZONE_UNTRUSTED; } catch { return false; } finally { if (persistZoneId != null) Marshal.FinalReleaseComObject(persistZoneId); } } const string CLSID_PersistentZoneIdentifier = "0968e258-16c7-4dba-aa86-462dd61e31a3"; const string IID_IZoneIdentifier = "cd45f185-1b21-48e2-967b-ead743a8914e"; [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid(IID_IZoneIdentifier)] public interface IZoneIdentifier { URLZONE GetId(); void SetId(URLZONE zone); void Remove(); } public enum URLZONE : uint { URLZONE_LOCAL_MACHINE = 0, URLZONE_INTRANET = 1, URLZONE_TRUSTED = 2, URLZONE_INTERNET = 3, URLZONE_UNTRUSTED = 4, } } 以明显的方式使用:BlockChecker.IsBlocked(fullPath). 如果文件不存在,它会返回true,所以请自己检查。 如果是这样,您也可以使用 zoneIdentifier.Remove(); persistFile.Save(path, true);
最有可能的是,您只需要解锁文件以防它被锁定。
官方的方法是调用 Powershell-cmdlet
Unblock-File。为此,请安装 nuget 包System.Management.Automation并使用以下代码:替代方式 - 您可以使用在当前版本的 Windows 中有关锁定文件的数据包含在名为 Zone.Identifier 的替代 NTFS 数据流中的知识,并通过 P/Invoke 将其删除(从 en.SO 借来的代码):
好的,如果您真的只需要检查是否有保护,则必须使用 COM 对象。PersistentZoneIdentifier COM 对象负责阻塞。代码从这里和这里借来,并进行了改编。
以明显的方式使用:
BlockChecker.IsBlocked(fullPath).如果文件不存在,它会返回
true,所以请自己检查。如果是这样,您也可以使用