「MonoやXamarinで絶対パスを取得する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
 
10行目: 10行目:
 
     using System;
 
     using System;
 
     using System.IO;
 
     using System.IO;
 +
    using System.Runtime.InteropServices;
  
 
     public static class PathUtil
 
     public static class PathUtil
18行目: 19行目:
 
             if (path.StartsWith("~/", StringComparison.Ordinal))
 
             if (path.StartsWith("~/", StringComparison.Ordinal))
 
             {
 
             {
                 var homePath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
+
#if NETCOREAPP
 +
                 string homePath = (
 +
                    RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ||
 +
                    RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
 +
                        ? Environment.GetEnvironmentVariable("HOME")
 +
                        : Environment.GetEnvironmentVariable("UserProfile");
 +
#else
 +
                string homePath = (
 +
                    Environment.OSVersion.Platform == PlatformID.Unix ||
 +
                    Environment.OSVersion.Platform == PlatformID.MacOSX)
 +
                        ? Environment.GetEnvironmentVariable("HOME")
 +
                        : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");
 +
#endif               
 
                 realPath = Path.Combine(homePath, path.Substring(2));
 
                 realPath = Path.Combine(homePath, path.Substring(2));
 
             }
 
             }
28行目: 41行目:
 
             return Path.GetFullPath(realPath);
 
             return Path.GetFullPath(realPath);
 
         }
 
         }
    }
 
 
</source>
 
</source>
  

2018年3月9日 (金) 05:15時点における最新版

C#においてWindows上で絶対パスを取得するだけならばSystem.IO.Path.GetFullPathメソッドでいいわけだが、 Linux上のmonoMacOS上のXamarinなどではホームディレクトリを表す「~(チルダ)」を解決してくれなくて残念な結果になる。

ダメな例
Path.GetFullPath("~/Documents/");
解決策

置換すればいい。

    using System;
    using System.IO;
    using System.Runtime.InteropServices;

    public static class PathUtil
    {
        public static string RealPath(string path)
        {
            var realPath = "";
            if (path.StartsWith("~/", StringComparison.Ordinal))
            {
#if NETCOREAPP
                string homePath = (
                    RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ||
                    RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                        ? Environment.GetEnvironmentVariable("HOME")
                        : Environment.GetEnvironmentVariable("UserProfile");
#else
                string homePath = (
                    Environment.OSVersion.Platform == PlatformID.Unix ||
                    Environment.OSVersion.Platform == PlatformID.MacOSX)
                        ? Environment.GetEnvironmentVariable("HOME")
                        : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");
#endif                
                realPath = Path.Combine(homePath, path.Substring(2));
            }
            else
            {
                realPath = path;
            }

            return Path.GetFullPath(realPath);
        }