DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

パス内の"."や".."を削除して、正規化する

例えば「C:\Windows\System\..\file.txt」を「C:\Windows\file.txt」に変換するように、パスの中に、現在のディレクトリを表す"."や、親ディレクトリを表す".."が入っている時、これらを含まないパスに変換する(正規化する)方法を紹介します。

FileInfoクラスをを使用する方法

FileInfoクラスを使うと、パスの正規化ができます。

VB.NET
コードを隠すコードを選択
'正規化するパス
Dim targetPath As String = "C:\Windows\.\System\..\file.txt"
'FileInfoオブジェクトを作成する
Dim fi As New System.IO.FileInfo(targetPath)
'絶対パスを取得する
Console.WriteLine(fi.FullName)
'C:\Windows\file.txt
C#
コードを隠すコードを選択
//正規化するパス
string targetPath = @"C:\Windows\.\System\..\file.txt";
//FileInfoオブジェクトを作成する
System.IO.FileInfo fi = new System.IO.FileInfo(targetPath);
//絶対パスを取得する
Console.WriteLine(fi.FullName);
//C:\Windows\file.txt

Path.GetFullPathメソッドを使用する方法

ちょっと変わった使い方ですが、Path.GetFullPathメソッドを使ってもパスの正規化ができます。

VB.NET
コードを隠すコードを選択
'正規化するパス
Dim targetPath As String = "C:\Windows\.\System\..\file.txt"
'絶対パスを取得する
Console.WriteLine(System.IO.Path.GetFullPath(targetPath))
'C:\Windows\file.txt
C#
コードを隠すコードを選択
//正規化するパス
string targetPath = @"C:\Windows\.\System\..\file.txt";
//絶対パスを取得する
Console.WriteLine(System.IO.Path.GetFullPath(targetPath));
//C:\Windows\file.txt

Win32 APIのPathCanonicalize関数を使用する方法

パスを正規化するWin32 APIに、PathCanonicalize functionがあります。P/InvokeでPathCanonicalize関数を使う方法は、「pinvoke.net: PathCanonicalize (shlwapi)」が参考になります。

VB.NET
コードを隠すコードを選択
'Imports System.Text
'Imports System.Runtime.InteropServices

<DllImport("shlwapi.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function PathCanonicalize( _
    <Out> lpszDest As StringBuilder, _
    lpszSrc As String) As Boolean
End Function

''' <summary>
''' 指定されたパスを正規化します。
''' </summary>
''' <param name="filePath">正規化するパス。</param>
''' <returns>正規化されたパス。</returns>
Public Shared Function NormalizePath(filePath As String) As String
    Dim sb As New StringBuilder(260)
    Dim res As Boolean = PathCanonicalize(sb, filePath)
    If Not res Then
        Throw New Exception("パスの正規化に失敗しました。")
    End If

    Return sb.ToString()
End Function
C#
コードを隠すコードを選択
//using System.Text;
//using System.Runtime.InteropServices;

[DllImport("shlwapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool PathCanonicalize(
    [Out] StringBuilder lpszDest,
    string lpszSrc);

/// <summary>
/// 指定されたパスを正規化します。
/// </summary>
/// <param name="filePath">正規化するパス。</param>
/// <returns>正規化されたパス。</returns>
public static string NormalizePath(string filePath)
{
    StringBuilder sb = new StringBuilder(260);
    bool res = PathCanonicalize(sb, filePath);
    if (!res)
    {
        throw new Exception("パスの正規化に失敗しました。");
    }

    return sb.ToString();
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。