ショートパスを得るもう一つの方法(Windows)

Windows環境でC#画面からバッチ起動するなんて良くあること。
引数にファイルのフルパス名を指定する場合に、ロングパス名を指定すると失敗することがあります。
そこで、長いパスから短いパス(8.3形式)に変換する必要がでてきます。
多くはWIN32API(Kernel32.dll の GetShortPathName)を使いますがプロジェクトによっては使用が許されないこともあります。
苦肉の策で考えたのが、バッチで変換する方法です。
自身の備忘記録としても...。

先ずはコマンドを記述したバッチファイルを作成します。
C:\GetShortPath.cmd
  1. @echo off
  2. setlocal
  3. set /p longPath=
  4. call :getShortPath %longPath%
  5. goto :fin
  6. :getShortPath
  7. echo %~fs1
  8. goto :fin
  9. :fin
  10. endlocal
  11. exit
そしてC#のコードです。
GetShortPath.cs
  1. public string GetShortPath (string longPath)
  2. {
  3.     string shortPath = string.Empty;

  4.     using (Process proc = new Process())
  5.     {
  6.         proc.StartInfo.FileName = "cmd.exe";
  7.         proc.StartInfo.WorkingDirectory = "c:\\";
  8.         proc.StartInfo.Arguments = "//B //Nologo /cGetShortPath.cmd";
  9.         proc.StartInfo.WindowStyle = Process.WindowStyleHidden;
  10.         proc.StartInfo.CreateNoWindow = true;
  11.         proc.StartInfo.UseShellExecute = false;
  12.         proc.StartInfo.RedirectStandardInput = true;
  13.         proc.StartInfo.RedirectStandardOutput = true;
  14.         proc.Start();
  15.         using (StreamWriter sw = proc.StandardInput)
  16.         {
  17.             sw.Write("\"" + longPath + "\"");
  18.         }
  19.         shortPath = proc.StandardOutput.ReadToEnd().Replace('\r', '').Replace('\n', '');
  20.         proc.WaitForExit();
  21.         proc.Close();
  22.     }
  23.     return shortPath;
  24. }
テストしてみます。
GetShortPath (@"C:\Program Files (x86)\Common Files\microsoft shared\SQL Server Developer Tools\SqlToolsVSNativeHelpers.dll");

返却値は以下の通り。
C:\PROGRA~2\COMMON~1\MICROS~1\SQLSER~1\SQLTOO~1.DLL

コメント