【问题标题】:Convert 8.3 filename to long filename将 8.3 文件名转换为长文件名
【发布时间】:2012-05-23 20:16:31
【问题描述】:

拥有一个以 8.3 短格式显示路径的网络位置。我需要将这些转换为长格式以便在 UNIX 上使用。

由于它是一个网络位置,我需要它使用 UNC 路径。

有什么想法吗?

【问题讨论】:

    标签: c# .net filenames


    【解决方案1】:

    将short 转换为long 的答案是just a Google search away。这适用于 UNC 路径 only on Windows Vista and up(以及可能带有一些服务包的 XP)。

    using System;
    using System.Runtime.InteropServices;
    using System.Text;
    
    public class _Main
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern int GetLongPathName(
            string path,
            StringBuilder longPath,
            int longPathLength
            );
    
        public static void Main()
        {
            StringBuilder longPath = new StringBuilder(255);
            GetLongPathName(@"\\?\UNC\server\d$\MYTEMP~1\RESOUR~1\sql.txt", longPath, longPath.Capacity);
            Console.WriteLine(longPath.ToString());
        }
    }
    

    【讨论】:

    • 这两个 MarshalAs 属性是不需要的。
    • 这仍然不适用于我的场景。我假设这是因为我的 UNC 路径。它是 NetApp 文件管理器上的 CIFS 共享。根据您的评论:这仅适用于 Windows Vista 及更高版本(以及可能带有某些服务包的 XP)上的 UNC 路径。我认为这可能是问题所在?
    • 它是如何失败的? Marshal::GetLastWin32Error 告诉你什么?
    • @David 确实如此。我现在已经删除了它们(它是从我发布的链接中复制和粘贴的)
    • @David Marshal.GetLastWin32Error 返回 5(拒绝访问)。
    【解决方案2】:

    即使使用 UNC 路径,这也适用于我:

    string shortName = @"\\MyComputer\c$\PROGRA~1";
    string longName = new FileInfo(shortName).FullName; 
    // ==> longname: \\MyComputer\c$\Program Files 
    

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      相关资源
      最近更新 更多