【问题标题】:Any replacement for Path.GetFullPath in WinRT?WinRT 中 Path.GetFullPath 的任何替代品?
【发布时间】:2014-04-23 07:27:04
【问题描述】:

在 Windows 应用商店应用的 .NET API 中,Path 类没有 GetFullPath 方法。不过,我需要规范化路径,这很容易使用 GetFullPath。有谁知道标准化路径的另一种方法或外部代码?我的意思是例如:

  • 如果路径不以驱动器开头,则添加应用程序的路径
  • 正确处理 ..\ 和 .\

GetFullPath 相当复杂,模仿功能并不容易。

【问题讨论】:

  • 鸡和蛋的问题。 WinRT 中完全没有进程默认工作目录的概念。所以你也永远不需要翻译相对路径。
  • 我能知道您需要完整路径的原因吗?据我所知,WinRT 中的所有文件引用都是在相对路径中完成的。如果您需要绝对路径,您通常会查看 URI,其中有一个新的构造函数,该构造函数接受 BaseUri + 您的相对路径,以获得完全限定的路径。
  • 我提出问题的原因是我正在编写新版本的 C# Codebook。我尝试将本书的所有配方(代码 sn-ps)翻译成适用于 Windows 应用商店应用的 .NET API。即使我不确定一个食谱是否有用,它也可能对读过这本书的人有用。我同意完整路径在常规 Windows 应用商店应用程序中没有真正意义。但是,如果声明了 PrivateNetworkClientServer 和 EnterpriseAuthentication 或 HomeGroup 功能,例如在使用 StorageFolder.GetFolderFromPathAsync 和 StorageFile.GetFileFromPathAsync 时,它们可能是有意义的。
  • 我刚刚尝试使用 StorageFile.GetFileFromPathAsync 访问文件夹和文件,并将完整的 UNC 路径或完整路径传递到可移动存储设备上的文件。如果分别声明了“PrivateNetworkClientServer”和“可移动存储”功能,它就可以工作。 UNC 路径甚至可以与本地文件一起使用!因此,使用完整路径非常有意义,至少在公司环境中(直接安装应用程序,跳过商店和认证)。

标签: windows-runtime windows-store-apps winrt-xaml


【解决方案1】:

据我了解,在 WinRT 中,您更愿意使用软件包的安装位置或“已知”文件夹:

  1. Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(fileName)

  2. KnownFolders.DocumentsLibrary.GetFileAsync(fileName)

【讨论】:

  • .. 或与应用程序数据文件夹 (ApplicationData.Current) 或与下载文件夹 (DownloadsFolder) 或与使用 FilePicker 或 FolderPicker 的一些其他文件夹。
  • .. 或(根据文档)在某些情况下使用 UNC 的任何网络文件夹(请参阅msdn.microsoft.com/en-us/library/windows/apps/hh967755.aspx
  • .. 或者如果声明了“可移动存储”功能,则用户可以访问可移动存储设备上的任何文件
【解决方案2】:

我没有找到 GetFullPath 的替代品,但开发了一种处理父目录标记 (..\) 的方法,例如 GetFullPath。

这里是:

public static string NormalizePath(string path)
{
   if (String.IsNullOrEmpty(path) == false)
   {
      // Correct multiple backslashes
      path = Regex.Replace(path, @"\\+", @"\");

      // Correct parent directory tokens with too many points in it
      path = Regex.Replace(path, @"\\\.\.+", @"\..");

      // Split the path into tokens
      List<string> resultingPathTokens = new List<string>();
      var pathTokens = path.Split('\\');

      // Iterate through the tokens to process parent directory tokens
      foreach (var pathToken in pathTokens)
      {
         if (pathToken == "..")
         {
            if (resultingPathTokens.Count > 1)
            {
               resultingPathTokens.RemoveAt(resultingPathTokens.Count - 1);
            }
         }
         else
         {
            resultingPathTokens.Add(pathToken);
         }
      }

      // Get the resulting path
      string resultingPath = String.Join("\\", resultingPathTokens);

      // Check if the path contains only two chars with a colon as the second
      if (resultingPath.Length == 2 && resultingPath[1] == ':')
      {
         // Add a backslash in this case
         resultingPath += "\\";
      }

      return resultingPath;
   }
   return path;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多