C#
ファイル関連
ファイルの有無を確認
// ファイルの有無を確認する
using System.IO ; // for File
string file_name = "C:\\BIN\\HPS.exe" ;
if (File.Exists(file_name))
{
/* ファイルが有る場合の処理 */
}
フォルダの有無を確認
// フォルダの有無を確認する
using System.IO ; // for Directory
string folder_name = "C:\\BIN" ;
if (Directory.Exists(folder_name))
{
/* フォルダが有る場合の処理 */
}
// Note: folder_name の末尾が "\\" であっても なくてもよい。
ファイルのコピー
// ファイルをコピーする
using System.IO ; // for File
File.Copy(file_src, file_dst) ; // ファイルの上書き不可(例外が発生)
File.Copy(file_src, file_dst, true) ; // ファイルの上書き可
ファイルの追加
// ファイル file_name1 の末尾に、別ファイル file_name2 の内容を追加する
using System.IO ; // for FileStream
void file_append(string file_name1, string file_name2)
{
FileStream writer = new FileStream(file_name1,
FileMode.Append,
FileAccess.Write) ;
FileStream reader = new FileStream(file_name2,
FileMode.Open,
FileAccess.Read) ;
int X ;
while ((X = reader.ReadByte()) != -1) writer.WriteByte((byte)X) ; // 追加
reader.Close() ;
writer.Close() ;
}
// Note: 上記、file_append() は、事前にファイルの存在チェックをしていない。実際
// に使用する場合は、必要に応じて、例外処理の記述を行うこと!
ファイルの削除
// ファイルを削除する
using System.IO ; // for File
File.Delete(file_name) ;
// Note: ファイルが使用中の場合は、例外が発生する!
// Note: ファイルが存在しなくても、例外は発生しない。
ファイルの移動
// ファイルを移動、または、名前の変更をする
using System.IO ; // for File
File.Move(file_src, file_dst) ;
// Note: 移動先に、同名ファイルが存在すると、例外が発生する!
ファイルの比較
// ファイル file_name1 と file_name2 の内容を比較する(同一なら 0 を返す)
using System.IO ; // for FileStream
int file_compare(string file_name1, string file_name2)
{
FileStream reader1 = new FileStream(file_name1,
FileMode.Open,
FileAccess.Read) ;
FileStream reader2 = new FileStream(file_name2,
FileMode.Open,
FileAccess.Read) ;
int X1, X2 ;
int ret_val = 1 ;
while (true)
{
X1 = reader1.ReadByte() ;
X2 = reader2.ReadByte() ;
if (X1 != X2) break ; // 比較
if (X1 == -1) { ret_val = 0 ; break ; }
}
reader1.Close() ;
reader2.Close() ;
return ret_val ;
}
// Note: 上記、file_compare() は、事前にファイルの存在チェックをしていない。実際
// に使用する場合は、必要に応じて、例外処理の記述を行うこと!
ファイルの監視
// ファイルの更新日時に変化がないか FileSystemWatcher を使って監視する
using System.IO ; // for FileSystemWatcher, Path
string file_name = @"C:\BIN\prog1\data1\test.txt" ; // 監視するファイルの指定
FileSystemWatcher fsw = new FileSystemWatcher() ;
fsw.Path = Path.GetDirectoryName(file_name) ;
fsw.Filter = Path.GetFileName(file_name) ;
fsw.NotifyFilter = NotifyFilters.LastWrite ;
fsw.IncludeSubdirectories = false ;
fsw.Changed += new FileSystemEventHandler(this.fsw_Changed) ;
fsw.EnableRaisingEvents = true ; // 監視スタート
private void fsw_Changed(object sender, System.IO.FileSystemEventArgs e)
{
/* 変化があった場合の処理 */
}
// Note: デザイナのツールボックスで、コンポーネント「FileSystemWatcher」を選択し、
// 組み込むことも可能。
ファイルの属性を取得
// ファイル(またはディレクトリ)の属性を取得する
// textBox1 で指定されたファイル名の属性を、textBox2 に表示する
配置 Button, TextBox, TextBox ;
using System.IO ; // for File, FileAttributes
private void button1_Click(object sender, System.EventArgs e)
{
string file_name = textBox1.Text ;
FileAttributes fa ;
try
{
fa = File.GetAttributes(file_name) ;
}
catch
{
textBox2.Text = "ファイル名がNGです!" ;
return ;
}
textBox2.Text = ((fa & FileAttributes.Archive) != 0) ? "A" : "-" ;
textBox2.Text += ((fa & FileAttributes.ReadOnly) != 0) ? "R" : "-" ;
textBox2.Text += ((fa & FileAttributes.Hidden) != 0) ? "H" : "-" ;
textBox2.Text += ((fa & FileAttributes.System) != 0) ? "S" : "-" ;
textBox2.Text += ((fa & FileAttributes.Directory)!= 0) ? "D" : "-" ;
}
ファイルの属性を設定
// ファイル(またはディレクトリ)の属性を設定する
// textBox1 で指定されたファイルを、textBox2 で指定された属性に設定する
配置 Button, TextBox, TextBox ;
using System.IO ; // for File, FileAttributes
private void button1_Click(object sender, System.EventArgs e)
{
FileAttributes fa = 0 ;
fa |= (textBox2.Text.IndexOf("A") != -1) ? FileAttributes.Archive : 0 ;
fa |= (textBox2.Text.IndexOf("R") != -1) ? FileAttributes.ReadOnly : 0 ;
fa |= (textBox2.Text.IndexOf("H") != -1) ? FileAttributes.Hidden : 0 ;
fa |= (textBox2.Text.IndexOf("S") != -1) ? FileAttributes.System : 0 ;
string file_name = textBox1.Text ;
try
{
File.SetAttributes(file_name, fa) ;
}
catch
{
MessageBox.Show("ファイル名がNGです!") ;
}
}
ファイルの日時を取得
// ファイル(またはディレクトリ)の日時情報を取得する
// textBox1 で指定されたファイル名の日時情報を、textBox2 に表示する
配置 Button, TextBox, TextBox ;
using System.IO ; // for File
private void button1_Click(object sender, System.EventArgs e)
{
DateTime fct, flat, flwt ;
string file_name = textBox1.Text ;
try
{
fct = File.GetCreationTime(file_name) ;
flat = File.GetLastAccessTime(file_name) ;
flwt = File.GetLastWriteTime(file_name) ;
}
catch
{
textBox2.Text = "ファイル名がNGです!" ;
return ;
}
textBox2.Text = "Creation = " + fct.ToString() + "\r\n" ;
textBox2.Text += "LastAccess = " + flat.ToString() + "\r\n" ;
textBox2.Text += "LastWrite = " + flwt.ToString() + "\r\n" ;
}
ファイルの日時を設定
// ファイル(またはディレクトリ)の日時情報を設定する
// textBox1 で指定されたファイルを、textBox2 で指定された日時情報に設定する
配置 Button, RadioButton, RadioButton, RadioButton, TextBox, TextBox ;
using System.IO ; // for File
private void button1_Click(object sender, System.EventArgs e)
{
string file_name = textBox1.Text ;
DateTime time = DateTime.Parse(textBox2.Text) ;
try
{
if (radioButton1.Checked) File.SetCreationTime(file_name, time) ;
else if (radioButton2.Checked) File.SetLastAccessTime(file_name, time) ;
else if (radioButton3.Checked) File.SetLastWriteTime(file_name, time) ;
}
catch
{
MessageBox.Show("ファイル名がNGです!") ;
}
}
// Note: SetLastAccessTime() は、うまく実行できない! 本メソッドを実行した日時に
// セットされる。
ファイルの日時を比較
// ファイル file_name1 と file_name2 の日時情報を比較する (by DateTime 構造体)
// 同一なら 0、file_name1 が新しいなら 1、file_name2 が新しいなら -1、を返す
using System.IO ; // for File
int N = DateTime.Compare(
File.GetLastWriteTime(file_name1),
File.GetLastWriteTime(file_name2)) ;
// Note: DateTime.Compare() で指定したファイルが存在しない場合、例外が発生する。
// 実際に使用する場合は、必要に応じて、例外処理の記述を行うこと!
// ファイル file_name1 と file_name2 の日時情報を比較する (by TimeSpan 構造体)
// 同一なら 0、file_name1 が新しいなら 1、file_name2 が新しいなら -1、を返す
using System.IO ; // for File
int file_time_compare(string file_name1, string file_name2)
{
TimeSpan span = File.GetLastWriteTime(file_name1) -
File.GetLastWriteTime(file_name2) ;
return Math.Sign(span.TotalMilliseconds) ;
}
// Note: 上記、file_time_compare() は、事前にファイルの存在チェックをしていない。
// 実際に使用する場合は、必要に応じて、例外処理の記述を行うこと!
ファイルのサイズを取得
// ファイルのサイズを取得する
// textBox1 で指定されたファイル名のサイズ情報を、textBox2 に表示する
配置 Button, TextBox, TextBox ;
using System.IO ; // for FileInfo
private void button1_Click(object sender, System.EventArgs e)
{
string file_name = textBox1.Text ;
FileInfo info = new FileInfo(file_name) ;
try
{
textBox2.Text = info.Length.ToString() + " バイト" ;
}
catch
{
textBox2.Text = "ファイル名がNGです!" ;
}
}
ファイルの拡張子を取得
// ファイルの拡張子を取得する
// textBox1 で指定されたファイルの拡張子を、textBox2 に表示する
配置 Button, TextBox, TextBox ;
using System.IO ; // for FileInfo
private void button1_Click(object sender, System.EventArgs e)
{
string file_name = textBox1.Text ;
FileInfo info = new FileInfo(file_name) ;
textBox2.Text = "拡張子は「" + info.Extension + "」です" ;
}
// Note: Extension での例外は、発生しない!
フォルダ内のファイル一覧
// textBox2 で指定されたフォルダ内の ファイルとフォルダを 一覧表示する
配置 Button, TextBox, TextBox ;
using System.IO ; // for Directory, DirectoryInfo
private void button1_Click(object sender, System.EventArgs e)
{
try
{
Directory.SetCurrentDirectory(textBox2.Text) ;
}
catch
{
textBox1.Text = "指定がNGです!" ;
return ;
}
DirectoryInfo current = new DirectoryInfo(".") ;
textBox1.Text = "{" + current.FullName + "}\r\n" ; // 現ディレクトリの表示
foreach (DirectoryInfo dir in current.GetDirectories()) // フォルダの一覧表示
{
textBox1.Text += "[" + dir.Name + "]\r\n" ;
}
foreach (FileInfo file in current.GetFiles()) // ファイルの一覧表示
{
textBox1.Text += file.Name + "\r\n" ;
}
}
フォルダ内の全サイズ取得
// フォルダ内(サブフォルダを含む)のファイルの合計サイズを取得する
using System.IO ; // for DirectoryInfo, FileInfo
private void button1_Click(object sender, System.EventArgs e)
{
DirectoryInfo di = new DirectoryInfo(textBox1.Text) ;
textBox2.Text = get_folder_size(di) + " バイト" ;
}
private long get_folder_size(DirectoryInfo di)
{
long size = 0 ;
foreach (FileInfo fi in di.GetFiles())
size += fi.Length ; // ファイルサイズの加算
foreach (DirectoryInfo sub_di in di.GetDirectories())
size += get_folder_size(sub_di) ; // 再帰 呼び出し
return size ;
}
ドライブの情報を取得
// 全ドライブの 容量、空き、DriveType、種類、FileSystem を取得する
配置 Button, TextBox ;
using System.IO ; // for Directory
using System.Management ; // for ManagementObject, ManagementPath
private void button1_Click(object sender, System.EventArgs e)
{
ManagementObject disk = new ManagementObject() ;
string[] drives = Directory.GetLogicalDrives() ; // 全てのドライブ名を取得
foreach(string drive in drives)
{
disk.Path = new ManagementPath("Win32_LogicalDisk='" + drive[0] + ":'") ;
long size, free ;
try
{
size = long.Parse("" + disk["Size"]) ;
free = long.Parse("" + disk["FreeSpace"]) ;
}
catch // 容量がゼロの場合に発生する「例外」の処理
{
size = 0 ;
free = 0 ;
}
textBox1.Text +=
drive[0] + ": " +
"容量 " + (size / 1024 / 1024).ToString().PadLeft(5) + "MB, " +
"空き " + (free / 1024 / 1024).ToString().PadLeft(5) + "MB, " +
"Type " + disk["DriveType"] + ", " +
disk["Description"] + " " + disk["FileSystem"] + "\r\n" ;
textBox1.Refresh() ;
}
}
// Note: "using System.Management ;" を有効にするためには 参照の追加 が必要。
// 具体的には、メインメニューで、プロジェクト → 参照の追加... を選択
// して、.NET のコンポーネント名「System.Management」を追加する。
// Note: 上の例の disk["xxx"] で記述されるオブジェクトを個別に扱う場合は、
// いったん、空文字列 "" と加算(string 型に変換)してから行うこと。
// Note: ドライブが DVD-RAM の場合、その情報の取得に、時間がかかる(10秒以上)
// ことがある!
// Note: 取得可能なドライブ情報の詳細は、MSDN『 Win32_LogicalDisk 』を参照。
空のファイルを作る
// 指定したファイル名で、ディスク上に 0 バイトのファイルを作成する
using System.IO ; // for Path
string file_name = @"C:\BIN\prog1\test.txt" ; // ファイル名の指定
FileStream fs = File.Create(file_name) ; // ファイルの作成と Open
fs.Close() ;
一時ファイルを作る
// 一意の一時ファイル名で、ディスク上に 0 バイトのファイルを作成する
using System.IO ; // for Path
string file_name = Path.GetTempFileName() ;
// Note: 一時ファイルは「C:\DOCUME~1\user1\LOCALS~1\Temp\tmp16C.tmp」のように、
// ユーザのローカル Temp フォルダの下に割り当てられる。
一時フォルダパスを取得
// 現在のシステムの一時フォルダのパスを取得する
using System.IO ; // for Path
string temp_path = Path.GetTempPath() ;
// Note: 一時フォルダは「C:\DOCUME~1\user1\LOCALS~1\Temp\」のように、ユーザの
// ローカル Temp フォルダ。
ファイル選択のダイアログ
// OpenFileDialog で、既存のファイル名(フルパス)を選択する
// OpenFileDialog で選択したファイル名を TextBox に表示する
配置 OpenFileDialog ;
private void button1_Click(object sender, System.EventArgs e)
{
// 以下の3行は オプション(なくてもOK)
// openFileDialog1.Title = "???" ; // タイトルバーの文字列
// openFileDialog1.InitialDirectory = "???" ; // 最初に表示されるディレクトリ
// openFileDialog1.Filter = "???" ; //「ファイルの種類」を指定
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = openFileDialog1.FileName ;
}
}
// Note:「ファイルの種類」を指定するには、Filter プロパティを設定する。
// その文字列は、<説明文字列>|<フィルタパターン>|... の繰り返しとなる。
// 複数のフィルタパターンは、セミコロン「;」で区切る。
// 例) "画像ファイル (*.BMP;*.JPG)|*.BMP;*.JPG|すべてのファイル (*.*)|*.*"
// Note: 上記、フィルタパターンでは、大文字と小文字の区別はしない。
ファイル保存のダイアログ
// SaveFileDialog で、ファイル名(フルパス)を設定する
// SaveFileDialog で設定したファイル名を TextBox に表示する
配置 SaveFileDialog ;
private void button1_Click(object sender, System.EventArgs e)
{
// 以下の3行は オプション(なくてもOK)
// saveFileDialog1.Title = "???" ; // タイトルバーの文字列
// saveFileDialog1.InitialDirectory = "???" ; // 最初に表示されるディレクトリ
// saveFileDialog1.Filter = "???" ; //「ファイルの種類」を指定
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = saveFileDialog1.FileName ;
}
}
// Note: ファイル名の入力で、ユーザが拡張子を入力しなかった場合、自動的に、
// このダイアログが、ファイル名に拡張子(ファイルフィルタで指定して
// いるもの)を付ける。
// Note: このダイアログを使うと、新しいファイル名も入力できる。
// CheckFileExists プロパティを true に設定すると、自動的に、
// 「xxxは存在しません。正しいファイル名が指定されているかどうかを
// 確認してください。」 [OK]
// という確認のダイアログが表示される。
// Note: 既存のファイル名を選択し、[保存] ボタンを押した場合、自動的に、
// 「xxxは既に存在します。置き換えますか?」 [はい(Y)] [いいえ(N)]
// という確認のダイアログが表示される。
// これを止めるには、OverwritePrompt プロパティを false に設定する。
フォルダ選択のダイアログ
// FolderBrowserDialog で、フォルダ名(フルパス)を選択する
// FolderBrowserDialog で選択したファイル名を TextBox に表示する
配置 FolderBrowserDialog ;
private void button1_Click(object sender, System.EventArgs e)
{
// フォルダの Root 設定 ( デフォルトは「デスクトップ」)
// 値は、string ではダメ! Environment.SpecialFolder を使う。
// folderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyMusic ;
// フォルダの初期選択の設定
// folderBrowserDialog1.SelectedPath = @"C:\" ;
//「新しいフォルダの作成」ボタンを隠す
// folderBrowserDialog1.ShowNewFolderButton = false ;
folderBrowserDialog1.Description = "ここに Description が表示される" ;
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = folderBrowserDialog1.SelectedPath ;
}
}
// Note: FolderBrowserDialog は .NET Framework 1.1 以降で使用可能 !
//『自作 Form』で、既存のフォルダ名(フルパス付き)を選択する
//「フォルダ/ファイルの選択」ダイアログを表示し、選択された フォルダ/ファイル
// を TextBox に表示する
private void button1_Click(object sender, System.EventArgs e)
{
Form2 form2 = new Form2() ; // フォルダ選択 Form の宣言
form2.selected_object = textBox1.Text ; // フォルダ位置の初期設定
form2.ShowDialog() ; // ダイアログの表示
if (form2.selected_object != "") // フォルダが選択されたかチェック
{
textBox1.Text = form2.selected_object ;
}
form2.Dispose() ; // 使用済み Form の後始末
}
フォルダの新規作成
// フォルダを新規作成する
using System.IO ; // for Directory
Directory.CreateDirectory("C:\\aaa\\bbb\\ccc\\ddd") ;
// Note: サブディレクトリも含めて作成される。
テキストファイルを読む
// テキストファイルを読み込む
using System.IO ; // for File, StreamReader
using System.Text ; // for Encoding
private void read_file(string file_name)
{
if (!File.Exists(file_name)) return ; // ファイルの有無をチェック
StreamReader reader = new StreamReader(file_name,
Encoding.GetEncoding("Shift_JIS")) ;
string A ;
while ((A = reader.ReadLine()) != null)
{
/* 読み込んだ1行分のテキスト A の処理 */
}
reader.Close() ;
}
// Note: ReadLine() は、行末コード "\r\n" を削除して、文字列を返す。
// Note: 一気にファイルの最後まで読み込むには、ReadToEnd() を使用する。
// なお、行末コード "\r\n" は削除せずに、文字列を返す。
テキストファイルを書く
// テキストファイルを書き込む
using System.IO ; // for StreamWriter
using System.Text ; // for Encoding
private void write_file(string file_name)
{
StreamWriter writer = new StreamWriter(file_name,
false, // 上書き ( true = 追加 )
Encoding.GetEncoding("Shift_JIS")) ;
writer.WriteLine(/* 書き込む1行分のテキスト */) ;
writer.Close() ;
}
// Note: WriteLine() は、自動的に、行末コード "\r\n" も書き込む。
// Note: 単純に文字列を書き込むには、Write() を使用する。
// なお、行末コード "\r\n" は、自動的には、書き込まない。
バイナリファイルを読む
// バイナリファイルを読み込む
using System.IO ; // for File, FileStream
private void read_bin_file(string file_name)
{
if (!File.Exists(file_name)) return ; // ファイルの有無をチェック
FileStream reader = new FileStream(file_name,
FileMode.Open,
FileAccess.Read) ;
int X ;
while ((X = reader.ReadByte()) != -1)
{
/* 読み込んだ1バイトデータ X の処理 */
}
reader.Close() ;
}
バイナリファイルを書く
// バイナリファイルを書き込む
using System.IO ; // for FileStream
private void write_bin_file(string file_name)
{
FileStream writer = new FileStream(file_name,
FileMode.Create, // 上書き
FileAccess.Write) ;
writer.WriteByte(/* 書き込む1バイト分のデータ */) ;
writer.Close() ;
}
テキストを exe に埋め込む
// テキストファイルを、実行ファイルに埋め込む
// 埋め込まれた テキストファイル "text1.txt" を、TextBox に表示する
// (1) テキストファイル "text1.txt" を埋め込む
ソリューションエクスプローラで、追加 → 既存項目の追加 を選択すると、ダイアログ
が開くので、そこで、埋め込みたいファイル "text1.txt" を選択する(このファイルは、
プロジェクト フォルダへ自動的にコピーされる)。
次に、このプロパティのページを開き、ビルドアクションを「埋め込まれたリソース」に
設定する。
// (2) 埋め込まれたテキストデータを取り出す
配置 Button, TextBox ;
using System.Reflection ; // for Assembly
using System.IO ; // for StreamReader
using System.Text ; // for Encoding
private void button1_Click(object sender, System.EventArgs e)
{
Assembly my_asm = Assembly.GetExecutingAssembly() ;
Stream st = my_asm.GetManifestResourceStream(
Application.ProductName + "." + "text1.txt") ; // Note 参照
StreamReader sr = new StreamReader(st, Encoding.GetEncoding("Shift_JIS")) ;
string A ;
while ((A = sr.ReadLine()) != null)
{
textBox1.AppendText(A + "\r\n") ;
}
sr.Close() ;
st.Close() ;
}
// Note: 埋め込んだファイルを、ManifestResource として指定する場合、ファイル名
// の先頭に、Application.ProductName + "." を付け加える必要がある。
// Note: 同様のことを画像について行う場合は、画像を exe に埋め込む を参照。
exe の中のファイルを復元
// 実行ファイルに埋め込まれた「ファイル」を、ファイルとして復元する
// (1) ファイルを埋め込む
ソリューションエクスプローラで、追加 → 既存項目の追加 を選択すると、ダイアログ
が開くので、そこで、埋め込みたいファイルを選択する(このファイルは、プロジェクト
フォルダへ自動的にコピーされる)。
次に、このプロパティのページを開き、ビルドアクションを「埋め込まれたリソース」に
設定する。
// (2) 埋め込まれた全ての「ファイル」を、ファイルとして復元する
private void Form1_Load(object sender, System.EventArgs e)
{
Assembly my_asm = Assembly.GetExecutingAssembly() ;
foreach (string res_name in my_asm.GetManifestResourceNames())
{
if (res_name.EndsWith(".resources")) continue ; // Note 参照
Stream st = my_asm.GetManifestResourceStream(res_name) ;
string file_name = res_name.Substring(Application.ProductName.Length + 1) ;
FileStream wr = new FileStream(file_name,
FileMode.OpenOrCreate,
FileAccess.Write) ;
int X ;
while ((X = st.ReadByte()) != -1) wr.WriteByte((byte)X) ;
wr.Close() ;
st.Close() ;
}
}
// Note: ユーザが埋め込んでいない "Form1.resources" などは、復元の対象外とする。
// Note: 埋め込まれたファイルのデータに直接アクセスしたい場合は、
// テキストを exe に埋め込む または、画像を exe に埋め込む を参照。
自分のファイル名を取得
// 自分自身の実行ファイル名(パス付き)を取得する
string file_name = Environment.GetCommandLineArgs()[0] ; // 例) "C:\BIN\test.exe"
// Note: GetCommandLineArgs() については、コマンドライン引数の取得 も参照。
// Note: 取得したファイル名については、ファイル名とパス名を分離 も参照。
自分のパスを取得
// 自分自身の実行ファイルがあるパスを取得する
string exe_path = Application.StartupPath ; // 例) "C:\BIN"
環境のパスを取得
// ユーザの [スタートアップ] フォルダのフルパスを取得する
string env_path = Environment.GetFolderPath(Environment.SpecialFolder.Startup) ;
// Note: SpecialFolder の全メンバは、Startup を含め、下記のとおり。
// ApplicationData
// CommonApplicationData
// CommonProgramFiles
// Cookies
// DesktopDirectory
// Favorites
// History
// InternetCache
// LocalApplicationData
// Personal
// ProgramFiles
// Programs
// Recent
// SendTo
// StartMenu
// Startup
// System
// Templates
カレントディレクトリの設定
// 自分自身の実行ファイルがある所を、カレントディレクトリに設定する
using System.IO ; // for Directory
Directory.SetCurrentDirectory(Application.StartupPath) ;
// Note: カレントディレクトリの既定値は、プロセスが起動したディレクトリである。
// 他アプリから自アプリが起動された場合、カレントディレクトリの既定値が、
// 他アプリのディレクトリになるので注意せよ!
ファイル名とパス名を分離
// フルパス付きファイル名から、ファイル名とパス名を抽出する (by Path Class)
using System.IO ; // for Path
string file_name = @"C:\abc\def\ghi.txt" ;
string path = Path.GetDirectoryName(file_name) ; // ← "C:\abc\def"
string name = Path.GetFileName(file_name) ; // ← "ghi.txt"
ディレクトリ区切り記号は '\' 以外に、下記のように '/' でも OK 。
string file_name = "http://abc/def/ghi.txt" ;
string path = Path.GetDirectoryName(file_name) ; // ← "http:\abc\def"
string name = Path.GetFileName(file_name) ; // ← "ghi.txt"
// Note: ファイルパスがルートの場合、パス名の語尾に '\' が付加される。例 "C:\"。
// Note: ファイル名からルートパス部分を取得するには、Path.GetPathRoot(file_name)
// メソッドを使用する。取得例 "C:\"。
// フルパス付きファイル名から、ファイル名とパス名を抽出する (by Regex Class)
using System.Text.RegularExpressions ; // for Regex
string file_name = @"C:\abc\def\ghi.txt" ;
Match match = Regex.Match(file_name, @"(.+)[\\/](.*)") ;
string path = match.Groups[1].Value ; // ← "C:\abc\def"
string name = match.Groups[2].Value ; // ← "ghi.txt"
ディレクトリ区切り記号は '\' 以外に、下記のように '/' でも OK 。
string file_name = "http://abc/def/ghi.txt" ;
Match match = Regex.Match(file_name, @"(.+)[\\/](.*)") ;
string path = match.Groups[1].Value ; // ← "http://abc/def"
string name = match.Groups[2].Value ; // ← "ghi.txt"
// Note: ファイルパスがルートの場合、パス名の語尾に '\' は付加されないので注意
// せよ! パス名(path) の語尾に、ディレクトリ区切り記号の '\' や '/' を
// 常に含めるには、@"(.+)[\\/](.*)" を @"(.+[\\/])(.*)" に変更すれば OK 。
ファイル名の拡張子を抽出
// 文字列の「.」以降を抽出する (by Path Class)
using System.IO ; // for Path
string file_name = @"C:\abc\def.txt" ;
string ext = Path.GetExtension(file_name) ; // ← ".txt"
// Note: 拡張子が見つからない場合は、"" を返す。
// Note: 拡張子を除いた(パスなしの)ファイル名を抽出するには、
// Path.GetFileNameWithoutExtension(file_name) メソッドを使用する。
// 文字列の「.」以降を抽出する (by Regex Class)
using System.Text.RegularExpressions ; // for Regex
string file_name = "abc.mp3" ;
string ext = Regex.Match(file_name, "[.][0-9a-zA-Z]{3,4}$").Value ; // ← ".mp3"
// Note: 上記の例では、拡張子は、英数字で 3文字以上4文字以下だけ を対象とする。
// 拡張子が見つからない場合は、"" を返す。
ファイル名に使える文字列
// 文字列を、ファイル名に使える文字列に修正する
// ファイル名に使えない文字『 \ / : , ; * ? " < > | 』を '_' に置換する
using System.Text.RegularExpressions ; // for Regex
string A = "aaa:bbb?ccc.mp3" ;
string B = Regex.Replace(A, "[\\\\/:,;*?\"<>|]", "_") ; // "aaa_bbb_ccc.mp3"
短いファイル名の取得
// 長いファイル名(パス付き)を、短いファイル名(8.3形式)に変換する
using System.Runtime.InteropServices ; // for DllImport
[DllImport("kernel32.dll")]
extern static int GetShortPathName(string s1, StringBuilder s2, int i1) ;
// 返り値 = 出力された文字数(失敗した場合、0 が返る)
// s1 = Long Name
// s2 = Short Name
// i1 = Short Name Buffer Length
string long_name = @"C:\BIN\ASCII コード表\chara_table.cpp" ; // 例
StringBuilder short_name = new StringBuilder(260) ;
int len = GetShortPathName(long_name, short_name, short_name.Capacity) ;
// 結果)
// short_name ← @"C:\BIN\ASCII~1\CHARA_~1.CPP"
// len ← 27
// Note: ディレクトリ名も短い形式に変換される。
// Note: "kernel32.dll" は、Windows に標準でインストールされている。