絶対パスを相対パスに変換
2480 ワード
最近仕事の上で使うツールを书いて、同僚と共用して、各种のファイルの経路を保存する必要があって、私达のファイルの构造が同じであることを保证するために、しかもファイルの间违いを减らす问题、ファイルの経路を保存する时相対的な経路で実现することを决めて、VSの中で経路を生成するように、胜手にプロジェクトをどこまで试験しても正常に运行することができます.
しかし、ネットで検索すると、悲しくて、半日探してもこの方面の参考コードや考え方がよくなかったので、自分で馬鹿な方法を考えました.
アルゴリズムの構想は:列の子を挙げて、例えば参考の経路があります:F:\ABCDE
相対パスに変換する必要があるソースパス:F:\ABC-1C-2C-3C-4
まず、2つのパスが共通する親パスstrParent=F:\ABを見つけ、親パス以外の参照パスCDEを相対パスstrRelative=.............に変換します.
そしてソースパスのstrParentをstrRelativeに置き換えればいいので簡単でしょう
次はソース
しかし、ネットで検索すると、悲しくて、半日探してもこの方面の参考コードや考え方がよくなかったので、自分で馬鹿な方法を考えました.
アルゴリズムの構想は:列の子を挙げて、例えば参考の経路があります:F:\ABCDE
相対パスに変換する必要があるソースパス:F:\ABC-1C-2C-3C-4
まず、2つのパスが共通する親パスstrParent=F:\ABを見つけ、親パス以外の参照パスCDEを相対パスstrRelative=.............に変換します.
そしてソースパスのstrParentをstrRelativeに置き換えればいいので簡単でしょう
次はソース
///
///
///
///
///
///
private string ChangeToRelativePath(string strReferencePath, string strSourcePath)
{
string strReferencePathRoot = Path.GetPathRoot(strReferencePath);
string strSourcePathRoot = Path.GetPathRoot(strSourcePath);
//
if (strReferencePathRoot != strSourcePathRoot)
return strSourcePath;
// ‘\\’
strReferencePath = strReferencePath.TrimEnd('\\');
strSourcePath = strSourcePath.TrimEnd('\\');
string[] arrLocationDirSegment = strReferencePath.Split('\\');
string[] arrSourceDirSegment = strSourcePath.Split('\\');
if (arrLocationDirSegment.Length == 0 || arrSourceDirSegment.Length == 0)
return strSourcePath;
//
string strSamePath = strReferencePathRoot;
//
string strLocationRelativePath = string.Empty;
//
for (int i = 1; i < arrLocationDirSegment.Length; i++)
{
if (i < arrSourceDirSegment.Length)
{
if (arrLocationDirSegment[i] == arrSourceDirSegment[i]) //
strSamePath += arrLocationDirSegment[i] + "\\";
else // ,
strLocationRelativePath += "..\\";
}
else// ,
strLocationRelativePath += "..\\";
}
return strSourcePath.Replace(strSamePath, strLocationRelativePath);
}
弟は初めてブログを书いて、少し兴奋して、もしみんながもっと良い考えがあれば、みんなはお互いに交流して勉强します