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 に標準でインストールされている。

(C)緑のバイク