有没有办法确定文件是否被隐藏?

时间:2018-05-19 15:33:56

标签: c# uwp

我一直在寻找一种了解Hidden对象的StorageFile属性状态的方法。据我所知,FileAttributes属性没有Hidden属性。任何解决方法?

2 个答案:

答案 0 :(得分:5)

UWP中有两个文件访问API。为UWP构建的较新版本为Windows.Storage,其中包含StorageFile,如您所述。这是专门为此沙盒方案构建的,其中应用程序对文件系统的访问权限有限。在这种情况下,Hidden属性实际上不可用,并且在调用Hidden等时甚至没有列出StorageFolder.GetFilesAsync()个文件。Storage API的主要优点是它们已构建作为异步,它们可以涵盖用户选择的文件夹等场景 - 然后您可以通过特定的StorageFolder实例获得临时权限。

第二个API集是旧的受信任System.IO文件API,它提供了更多控制并包含对Hidden属性的控制。缺点是默认情况下,您只能使用此API访问应用程序的安装和AppData位置,除非您的应用程序声明了广泛文件系统访问API或应用程序别名,这是Windows 10 April 2018更新及更高版本中的新功能。

答案 1 :(得分:0)

我试图找到一种适用于UWP存储文件的解决方案,这些文件不一定位于已知目录(例如应用程序文件夹,下载,图片等)中。

对于已知目录,您可以使用文件路径创建FileInfo的新实例,并且其attribute属性将告诉您该文件是否被隐藏。 不幸的是,该解决方案不适用于已知目录之外的文件,因为询问FileInfo实例的属性将引发未授权的访问异常(或类似的东西)。

我确实找到了一种解决方案,假设您可以访问请求的文件的StorageFile对象,该解决方案可以检查文件系统各个部分中文件的hidden属性:

public bool isHidden(StorageFile file) {
  var extendedFileAttributes = "System.FileAttributes";
  uint hiddenAttributeValue = (uint) FileAttributes.Hidden;
  IDictionary<string, object> retrievedProperties =
    await file.Properties.RetrievePropertiesAsync(new List<string> { extendedFileAttributes });
  var attributes = retrievedProperties[extendedFileAttributes];
  if (attributes != null)
  {
      return (((uint)attributes & hiddenAttributeValue) == hiddenAttributeValue));
  }
  return false;
}

获取扩展文件属性: https://docs.microsoft.com/en-us/windows/uwp/files/quickstart-getting-file-properties

要检索的字符串: https://docs.microsoft.com/en-us/windows/win32/properties/core-bumper