ファイルに関する情報を取得するためのライブラリを自作しました。
Contents
簡単な説明
ファイル名を取得するだけなら
1 2 |
FileInfo info = new FileInfo(fullPath); return info.Name; |
これで済むのですが、拡張子つきのファイル名が取得されてしまいます。ファイル名変更のとき、拡張子そのままでファイル名のあとに文字列を追加したいとき面倒なのでそのために使えるライブラリを作成しました。
フォルダのパスを取得したい場合、ファイルのフルパスを指定したときは
1 2 |
FileInfo info = new FileInfo(fullPath); return info.DirectoryName; |
これでいいのですが、指定したパスがフォルダの場合、最後に\がつくときとつかないときとでは結果が違います。そこでフォルダのパスをわたしたときに最後に\がつく場合もつかない場合も親フォルダを返すようにGetFolderPathメソッドを作成しました。
作成したコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
using System.IO; public class FileInfoEx { /// <summary> /// 渡されたパスはフォルダかどうか? /// </summary> /// <param name="fullPath">ファイルまたはフォルダのフルパス</param> /// <returns>フォルダであればtrue、ファイルならfalse</returns> static public bool IsFolder(string fullPath) { FileInfo info = new FileInfo(fullPath); return info.Attributes.HasFlag(FileAttributes.Directory); } /// <summary> /// フォルダのパスを返す /// </summary> /// <param name="fullPath">ファイルのフルパス</param> /// <returns>フォルダのフルパス</returns> static public string GetFolderPath(string fullPath) { if(IsFolder(fullPath)) { DirectoryInfo info = new DirectoryInfo(fullPath); return info.Parent.FullName; } { FileInfo info = new FileInfo(fullPath); return info.DirectoryName; } } /// <summary> /// ファイル名の拡張子を含まない部分を返す /// </summary> /// <param name="fullPath">ファイルのフルパス</param> /// <returns>拡張子のないファイル名(引数がフォルダのパスなら空の文字列を返す)</returns> static public string GetFileNameWithoutExtension(string fullPath) { if(IsFolder(fullPath)) return ""; FileInfo info = new FileInfo(fullPath); string name = info.Name; int i = name.LastIndexOf("."); if (i != -1) return name.Substring(0, i); else return name; } /// <summary> /// ファイル名のみを返す(ただし拡張子は含む) /// </summary> /// <param name="fullPath">ファイルのフルパス</param> /// <returns>拡張子つきのファイル名(引数がフォルダのパスなら空の文字列を返す)</returns> static public string GetFileName(string fullPath) { if(IsFolder(fullPath)) return ""; FileInfo info = new FileInfo(fullPath); return info.Name; } /// <summary> /// 拡張子を返す(戻り値の先頭に「.」がつく) /// </summary> /// <param name="fullPath">ファイルのフルパス</param> /// <returns>拡張子(先頭に「.」がつく)</returns> static public string GetExtension(string fullPath) { FileInfo info = new FileInfo(fullPath); return info.Extension; } } |
使用例
同じ名前のファイルがすでに存在する場合、別名に変更してから保存します。普通は上書き保存すると前のファイルは消えてしまいますが、これならバックアップとして残ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
using System; using System.ComponentModel; using System.Windows.Forms; using System.IO; public partial class Form1 : Form { /// <summary> /// テキストボックス内のテキストをファイルとして保存するだけ (^^;) /// </summary> private void button1_Click(object sender, EventArgs e) { SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "テキストファイル(*.txt)|*.txt"; if(dialog.ShowDialog() == DialogResult.OK) { string str = textBox1.Text; SaveFile(dialog.FileName, str); } dialog.Dispose(); } /// <summary> /// 同名のファイルがある場合、そのファイルを別名に変更してから保存する /// </summary> /// <param name="filePath">保存するファイルのフルパス</param> /// <param name="str">保存したい文字列</param> void SaveFile(string filePath, string str) { if(File.Exists(filePath)) { string oldFileName = FileInfoEx.GetFileNameWithoutExtension(filePath); DateTime dt = DateTime.Now; string strNow = dt.ToString("yyyy年MM月dd日 HH時mm分ss秒"); string newFileName = String.Format("{0}(バックアップ {1})", oldFileName, strNow); string backupFilePath = String.Format("{0}\\{1}{2}", FileInfoEx.GetFolderPath(filePath), newFileName, FileInfoEx.GetExtension(filePath)); File.Move(filePath, backupFilePath); } StreamWriter sw = new StreamWriter(filePath); sw.Write(str); sw.Close(); } } |