|
3 | 3 | using System.Diagnostics; |
4 | 4 | using System.IO; |
5 | 5 | using System.Linq; |
| 6 | +using System.Net; |
6 | 7 | using System.Runtime.InteropServices; |
7 | 8 | using System.Security.Cryptography; |
8 | 9 | using System.Text; |
@@ -279,6 +280,11 @@ public static class Utility |
279 | 280 | /// <see cref="ToSafeFileName"/> の既定最大長。 |
280 | 281 | /// </summary> |
281 | 282 | private const int SAFE_FILENAME_DEFAULT_MAX_LENGTH = 180; |
| 283 | + |
| 284 | + /// <summary> |
| 285 | + /// コンピュータ名が取得できなかった場合のフォールバック文字列。 |
| 286 | + /// </summary> |
| 287 | + private const string UNKNOWN_COMPUTER_NAME = "Unknown Computer"; |
282 | 288 | #endregion |
283 | 289 |
|
284 | 290 | #region private interop (macOS) |
@@ -374,6 +380,39 @@ private static bool TryGetFileSystemInfoOnMac(string path, out string fsType, ou |
374 | 380 | #endregion |
375 | 381 |
|
376 | 382 | #region public methods |
| 383 | + /// <summary> |
| 384 | + /// 実行中のコンピュータ名をベストエフォートで取得します。 |
| 385 | + /// </summary> |
| 386 | + /// <returns>取得できたコンピュータ名。取得できない場合は <see cref="UNKNOWN_COMPUTER_NAME"/>。</returns> |
| 387 | + public static string GetComputerName() |
| 388 | + { |
| 389 | + var machineName = TryGetEnvironmentMachineName(); |
| 390 | + if (!string.IsNullOrWhiteSpace(machineName)) |
| 391 | + { |
| 392 | + return machineName; |
| 393 | + } |
| 394 | + |
| 395 | + var hostName = TryGetDnsHostName(); |
| 396 | + if (!string.IsNullOrWhiteSpace(hostName)) |
| 397 | + { |
| 398 | + return hostName; |
| 399 | + } |
| 400 | + |
| 401 | + var envHost = Environment.GetEnvironmentVariable("HOSTNAME"); |
| 402 | + if (!string.IsNullOrWhiteSpace(envHost)) |
| 403 | + { |
| 404 | + return envHost; |
| 405 | + } |
| 406 | + |
| 407 | + var envComputer = Environment.GetEnvironmentVariable("COMPUTERNAME"); |
| 408 | + if (!string.IsNullOrWhiteSpace(envComputer)) |
| 409 | + { |
| 410 | + return envComputer; |
| 411 | + } |
| 412 | + |
| 413 | + return UNKNOWN_COMPUTER_NAME; |
| 414 | + } |
| 415 | + |
377 | 416 | /// <summary> |
378 | 417 | /// 指定パスがネットワーク共有(UNC/NFS/CIFS/SSHFS など)の可能性が高いかを判定します。 |
379 | 418 | /// - Windows: UNC (\\\\ / \\?\UNC\) とネットワークドライブを検出。 |
@@ -1065,5 +1104,37 @@ public static string BuildBaseLabel(string command, string[] args) |
1065 | 1104 | /// <exception cref="Exception">例外は発生せず、常に結合済み文字列を返します。</exception> |
1066 | 1105 | public static string GetUsedArgs(string[] args) => string.Join(" ", args.Select(x => x.Contains(' ') ? $"\"{x}\"" : x)); |
1067 | 1106 | #endregion |
| 1107 | + |
| 1108 | + #region private helper methods |
| 1109 | + /// <summary> |
| 1110 | + /// <see cref="Environment.MachineName"/> にアクセスし、取得できない場合は null を返します。 |
| 1111 | + /// </summary> |
| 1112 | + private static string TryGetEnvironmentMachineName() |
| 1113 | + { |
| 1114 | + try |
| 1115 | + { |
| 1116 | + return Environment.MachineName; |
| 1117 | + } |
| 1118 | + catch |
| 1119 | + { |
| 1120 | + return null; |
| 1121 | + } |
| 1122 | + } |
| 1123 | + |
| 1124 | + /// <summary> |
| 1125 | + /// <see cref="Dns.GetHostName"/> にアクセスし、取得できない場合は null を返します。 |
| 1126 | + /// </summary> |
| 1127 | + private static string TryGetDnsHostName() |
| 1128 | + { |
| 1129 | + try |
| 1130 | + { |
| 1131 | + return Dns.GetHostName(); |
| 1132 | + } |
| 1133 | + catch |
| 1134 | + { |
| 1135 | + return null; |
| 1136 | + } |
| 1137 | + } |
| 1138 | + #endregion |
1068 | 1139 | } |
1069 | 1140 | } |
0 commit comments