ショートパスを得るもう一つの方法(Windows)
Windows環境でC#画面からバッチ起動するなんて良くあること。
引数にファイルのフルパス名を指定する場合に、ロングパス名を指定すると失敗することがあります。
そこで、長いパスから短いパス(8.3形式)に変換する必要がでてきます。
多くはWIN32API(Kernel32.dll の GetShortPathName)を使いますがプロジェクトによっては使用が許されないこともあります。
苦肉の策で考えたのが、バッチで変換する方法です。
自身の備忘記録としても...。
先ずはコマンドを記述したバッチファイルを作成します。
C:\GetShortPath.cmd
GetShortPath.cs
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
引数にファイルのフルパス名を指定する場合に、ロングパス名を指定すると失敗することがあります。
そこで、長いパスから短いパス(8.3形式)に変換する必要がでてきます。
多くはWIN32API(Kernel32.dll の GetShortPathName)を使いますがプロジェクトによっては使用が許されないこともあります。
苦肉の策で考えたのが、バッチで変換する方法です。
自身の備忘記録としても...。
先ずはコマンドを記述したバッチファイルを作成します。
C:\GetShortPath.cmd
- @echo off
- setlocal
- set /p longPath=
- call :getShortPath %longPath%
- goto :fin
- :getShortPath
- echo %~fs1
- goto :fin
- :fin
- endlocal
- exit
GetShortPath.cs
- public string GetShortPath (string longPath)
- {
- string shortPath = string.Empty;
- using (Process proc = new Process())
- {
- proc.StartInfo.FileName = "cmd.exe";
- proc.StartInfo.WorkingDirectory = "c:\\";
- proc.StartInfo.Arguments = "//B //Nologo /cGetShortPath.cmd";
- proc.StartInfo.WindowStyle = Process.WindowStyleHidden;
- proc.StartInfo.CreateNoWindow = true;
- proc.StartInfo.UseShellExecute = false;
- proc.StartInfo.RedirectStandardInput = true;
- proc.StartInfo.RedirectStandardOutput = true;
- proc.Start();
- using (StreamWriter sw = proc.StandardInput)
- {
- sw.Write("\"" + longPath + "\"");
- }
- shortPath = proc.StandardOutput.ReadToEnd().Replace('\r', '').Replace('\n', '');
- proc.WaitForExit();
- proc.Close();
- }
- return shortPath;
- }
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
コメント