/// </summary>\r
/// <param name="enus">元となる複数のイテレータ</param>\r
/// <returns>結合されたイテレータ</returns>\r
- public static List<T> MeargeList<T>(params IEnumerable<T>[] enus)\r
+ public static List<T> MergeList<T>(params IEnumerable<T>[] enus)\r
{\r
List<T> list = new List<T>();\r
\r
/// <param name="enu">元となるイテレータ</param>\r
/// <returns>変換された配列</returns>\r
public static T[] IEnumerable2Array<T>(IEnumerable<T> enu) {\r
- if (enu is T[]) {\r
- return (T[]) enu;\r
- } else {\r
- return ((enu is List<T>)? ((List<T>)enu):new List<T>(enu)).ToArray();\r
+ T[] retval = enu as T[];\r
+ \r
+ if (retval == null) {\r
+ List<T> list = enu as List<T>;\r
+ if (list == null) {\r
+ list = new List<T>(enu);\r
+ }\r
+ retval = list.ToArray();\r
}\r
+ \r
+ return retval;\r
}\r
\r
/// <summary>\r
#region ファイル情報関連ユーテイリティ関数\r
\r
/// <summary>\r
- /// パス変数に指定のフォルダを追加する\r
+ /// ã\83\91ã\82¹å¤\89æ\95°ã\81«æ\8c\87å®\9aã\81®ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\82\92追å\8a ã\81\99ã\82\8b\r
/// </summary>\r
- /// <param name="dir">追加するフォルダ</param>\r
+ /// <param name="dir">追加するフォルダー</param>\r
public static void AddDirectoryToPath(string dir)\r
{\r
string path = Environment.GetEnvironmentVariable("PATH");\r
/// URLからそのファイル名を生成する\r
/// </summary>\r
/// <param name="url">対象のurl</param>\r
- public static string Url2filename(string url)\r
+ public static string Url2filename(Uri url)\r
{\r
- string filename = Path.GetFileName(System.Web.HttpUtility.UrlDecode(url, Encoding.UTF8));\r
+ string filename = Path.GetFileName(System.Web.HttpUtility.UrlDecode(url.ToString(), Encoding.UTF8));\r
\r
int pos;\r
if ((pos = filename.IndexOfAny(Path.GetInvalidFileNameChars())) >= 0) {\r
}\r
\r
/// <summary>\r
- /// 再帰的にファイルの属性を指定します。強制的にフォルダの再帰削除の前に読み込み専用属性を消すのに使います。\r
+ /// å\86\8d帰ç\9a\84ã\81«ã\83\95ã\82¡ã\82¤ã\83«ã\81®å±\9eæ\80§ã\82\92æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82å¼·å\88¶ç\9a\84ã\81«ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81®å\86\8d帰å\89\8aé\99¤ã\81®å\89\8dã\81«èªã\81¿è¾¼ã\81¿å°\82ç\94¨å±\9eæ\80§ã\82\92æ¶\88ã\81\99ã\81®ã\81«ä½¿ã\81\84ã\81¾ã\81\99ã\80\82\r
/// </summary>\r
- /// <param name="path">設定するフォルダ</param>\r
+ /// <param name="path">設定するフォルダー</param>\r
/// <param name="attr">設定する属性値</param>\r
public static void SetAttributeRecursive(string path, FileAttributes attr)\r
{\r
File.SetAttributes(file, attr);\r
}\r
\r
- // 子フォルダを再帰的に属性変更\r
+ // å\90ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\82\92å\86\8d帰ç\9a\84ã\81«å±\9eæ\80§å¤\89æ\9b´\r
foreach (string file in Directory.GetDirectories(path)) {\r
SetAttributeRecursive(file, attr);\r
}\r
/// <summary>\r
/// 再帰的にファイルのアクセス権限(ユーザ権限など)を設定します\r
/// </summary>\r
- /// <param name="path">設定するフォルダ</param>\r
+ /// <param name="path">設定するフォルダー</param>\r
/// <param name="filesec">変更先権限</param>\r
public static void SetAccessControlRecursive(string path, FileSecurity filesec)\r
{\r
File.SetAccessControl(file, filesec);\r
}\r
\r
- // 子フォルダを再帰的に権限変更\r
+ // å\90ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\82\92å\86\8d帰ç\9a\84ã\81«æ¨©é\99\90å¤\89æ\9b´\r
foreach (string file in Directory.GetDirectories(path)) {\r
SetAccessControlRecursive(file, filesec);\r
}\r
}\r
\r
/// <summary>\r
- /// ファイルまたはフォルダの容量を算出して返す\r
+ /// ã\83\95ã\82¡ã\82¤ã\83«ã\81¾ã\81\9fã\81¯ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81®å®¹é\87\8fã\82\92ç®\97å\87ºã\81\97ã\81¦è¿\94ã\81\99\r
/// </summary>\r
/// <param name="path">\r
- /// 対象ファイル及びフォルダのパス\r
+ /// 対象ã\83\95ã\82¡ã\82¤ã\83«å\8f\8aã\81³ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81®ã\83\91ã\82¹\r
/// </param>\r
/// <returns>\r
/// 計算された容量(バイト単位)\r
}\r
\r
/// <summary>\r
- /// フォルダの容量を算出して返す\r
+ /// ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81®å®¹é\87\8fã\82\92ç®\97å\87ºã\81\97ã\81¦è¿\94ã\81\99\r
/// </summary>\r
/// <param name="dirInfo">\r
- /// 対象フォルダ\r
+ /// 対象フォルダー\r
/// </param>\r
/// <returns>\r
/// 計算された容量(バイト単位)\r
/// パスをパス区切り文字列ごとに分割した配列を返す\r
/// </summary>\r
/// <param name="path">パス文字列。相対・絶対は区別しない</param>\r
- /// <returns>フォルダ名ごとに分けられた文字列配列</returns>\r
+ /// <returns>フォルダー名ごとに分けられた文字列配列</returns>\r
private static string[] splitPath(string path)\r
{\r
return path.Split(new char[]{Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar});\r
}\r
\r
/// <summary>\r
- /// Converts a given absolute path and a given base path to a path that leads\r
- /// from the base path to the absoulte path. (as a relative path)\r
+ /// パスがフォルダーのとき、最後がパスセパレータで終了するようにする。\r
+ /// </summary>\r
+ /// <param name="path">パス</param>\r
+ /// <returns>処理されたパス</returns>\r
+ private static string fixLastPathCharForDirectory(string path)\r
+ {\r
+ string fixedPath = path;\r
+ if (Directory.Exists(path) && path[path.Length-1] != Path.DirectorySeparatorChar) {\r
+ fixedPath += Path.DirectorySeparatorChar;\r
+ }\r
+ return fixedPath;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 絶対パスを相対パスに変換して返します。\r
/// </summary>\r
+ /// <param name="baseDirectoryPath">相対パスの基準のフォルダー</param>\r
+ /// <param name="absPath">絶対パス</param>\r
+ /// <returns><code>absPath</code>の絶対パス表現</returns>\r
public static string GetRelativePath(string baseDirectoryPath, string absPath)\r
{\r
- // TODO SharpDevelopのICSharpCode.Core.FileUtilityからのコピペ(GPL)\r
+ Uri baseuri = new Uri(fixLastPathCharForDirectory(baseDirectoryPath));\r
+ Uri absuri = new Uri(fixLastPathCharForDirectory(absPath));\r
\r
- string[] bPath = splitPath(baseDirectoryPath);\r
- string[] aPath = splitPath(absPath);\r
- int indx = 0;\r
- for(; indx < Math.Min(bPath.Length, aPath.Length); ++indx){\r
- if(!bPath[indx].Equals(aPath[indx], StringComparison.OrdinalIgnoreCase))\r
- break;\r
- }\r
-\r
- if (indx == 0) {\r
- return absPath;\r
- }\r
-\r
- StringBuilder erg = new StringBuilder();\r
-\r
- if(indx == bPath.Length) {\r
-// erg.Append('.');\r
-// erg.Append(Path.DirectorySeparatorChar);\r
- } else {\r
- for (int i = indx; i < bPath.Length; ++i) {\r
- erg.Append("..");\r
- erg.Append(Path.DirectorySeparatorChar);\r
- }\r
- }\r
- erg.Append(String.Join(Path.DirectorySeparatorChar.ToString(), aPath, indx, aPath.Length-indx));\r
- return erg.ToString();\r
+ string relative = baseuri.MakeRelativeUri(absuri).ToString();\r
+ relative = System.Web.HttpUtility.UrlDecode(relative);\r
+ relative = relative.Replace('/', Path.DirectorySeparatorChar);\r
+ \r
+ return relative;\r
}\r
\r
/// <summary>\r
if (fol == ".") {\r
// 無視\r
} else if (fol == "..") {\r
- // 一つ前のフォルダを消す\r
+ // ä¸\80ã\81¤å\89\8dã\81®ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\82\92æ¶\88ã\81\99\r
newFolders.RemoveAt(newFolders.Count-1);\r
} else {\r
newFolders.Add(fol);\r
\r
#region シリアル化関連\r
\r
+ \r
/// <summary>\r
/// XMLでシリアル化したオブジェクトのXMLファイルを読み込み、デシリアル化したオブジェクトを取得する\r
/// </summary>\r
/// <param name="path">XMLファイルのパス</param>\r
+ /// <param name="sr">シリアライザ</param>\r
/// <returns>デシリアル化されたオブジェクト</returns>\r
- public static T GetDeserializedObject<T>(string path)\r
+ public static object GetDeserializedObject(string path, System.Xml.Serialization.XmlSerializer sr)\r
{\r
- T retVal = default(T);\r
+ object retVal = null;\r
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) {\r
- System.Xml.Serialization.XmlSerializer sr = new System.Xml.Serialization.XmlSerializer(typeof(T));\r
- retVal = (T) sr.Deserialize(fs);\r
+ retVal = sr.Deserialize(fs);\r
}\r
return retVal;\r
}\r
\r
/// <summary>\r
+ /// XMLでシリアル化したオブジェクトのXMLファイルを読み込み、デシリアル化したオブジェクトを取得する\r
+ /// </summary>\r
+ /// <param name="path">XMLファイルのパス</param>\r
+ /// <returns>デシリアル化されたオブジェクト</returns>\r
+ public static T GetDeserializedObject<T>(string path)\r
+ {\r
+ T retVal = default(T);\r
+ System.Xml.Serialization.XmlSerializer sr = new System.Xml.Serialization.XmlSerializer(typeof(T));\r
+ retVal = (T) GetDeserializedObject(path, sr);\r
+ return retVal;\r
+ }\r
+ \r
+ /// <summary>\r
/// オブジェクトをXMLでシリアル化してファイルに書き込む\r
/// </summary>\r
/// <param name="path">XMLファイルのパス</param>\r