ファイル

関連するクラス
  クラス 用途
  File ファイルを
  • 作成、コピー、削除、移動、オープン
ための静的メソッドを提供し、FileStream オブジェクトの作成を支援する
FileInfo ファイルを
  • 作成、コピー、削除、移動、オープン
ためのインスタンスメソッドを提供し、FileStream オブジェクトの作成を支援する
  Directory ディレクトリやサブディレクトリを
  • 作成、削除、移動、反復処理
ための、静的メソッドを提供する
DirectoryInfo ディレクトリやサブディレクトリを
  • 作成、削除、移動、反復処理
ための、インスタンスメソッドを提供する
  Path 複数のプラットフォームにまたがってディレクトリ文字列を処理するための、メソッドおよびプロパティを提供する
ファイルとディレクトリ - ファイルおよびストリーム入出力 - .NET | Microsoft Docs

File

メソッド 機能
 
メソッド - File クラス (System.IO) | MSDN

ファイルの作成

ファイルを作成し、そのストリームを取得できます。そのときファイルが存在しないならば、作成されます。

メソッド 機能
Create(String) 読み取り、書き込み用に、ファイルを作成。すでに存在する場合は上書き
CreateText(String) 書き込み用に、テキストファイルを作成。すでに存在する場合は上書き
このメソッドは、StreamWriter(String, false)の呼び出しに等しい
public static System.IO.FileStream Create (string path);
Create(String) - File.Create Method (System.IO) | Microsoft Docs
string path = "sample.txt";
using (FileStream fs = File.Create(path))
{
    byte value = (byte)'A';
    fs.WriteByte(value);
}

ファイルのオープン

ファイルを開き、そのストリームを取得できます。

メソッド 機能 ファイルが存在しない場合
Open(String, FileMode) 読み取り、書き込み用にファイルを開く FileModeの指定による
OpenRead(String) 読み取り用にファイルを開く FileNotFoundException例外が発生
OpenText(String) 読み取り用にテキストファイルを開 FileNotFoundException例外が発生
OpenWrite(String) 書き込み用にファイルを開く ファイルを作成する
public static System.IO.FileStream Open (
    string path,
    System.IO.FileMode mode,
    System.IO.FileAccess access,
    System.IO.FileShare share
    );
Open(String, FileMode, FileAccess, FileShare) - File.Open Method (System.IO) | Microsoft Docs
FileStream fileStream
  = File.Open("sample.dat", FileMode.Create, FileAccess.Write, FileShare.Read);

ファイルの削除

指定ファイルを削除できます。

public static void Delete(
    string path
)
File.Delete メソッド (String) (System.IO) | MSDN
  • ファイルまでのパスが存在しない … System.IO.DirectoryNotFoundException例外が発生
  • ファイルまでのパスは存在するが、そこにファイルが存在しない … 例外は発生しない
  • ファイルは存在するが、使用中 … System.IO.IOException例外が発生

さまざまな要因で例外が発生するため、File.Exists()でアクセスできることを確認してから削除するのが安全です。

ファイルの存在確認

public static bool Exists (string path);
File.Exists(String) Method (System.IO) | Microsoft Docs

指定ファイルにアクセス可能ならば、trueが返されます。アクセスできなければfalseとなり、それには次のような場合も該当します。

  • ファイルは存在しているが、アクセス権を持たない
  • 指定のパスがディレクトリを表している

ファイルの情報

File

string path = "sample.txt";

DateTime dateTime1 = File.GetCreationTime(path);   // 作成日時 (Created)
DateTime dateTime2 = File.GetLastWriteTime(path);  // 更新日時 (Modified)
DateTime dateTime3 = File.GetLastAccessTime(path); // アクセス日時 (Accessed)
FileAttributes attributes = File.GetAttributes(path); // 属性
File.GetCreationTime メソッド (String) (System.IO) | MSDN

FileInfo

同様の内容は、FileInfoではプロパティとして取得できます。

string path = "sample.txt";
FileInfo fileInfo = new FileInfo(path);

DateTime dateTime1 = fileInfo.CreationTime;   // 作成日時
DateTime dateTime2 = fileInfo.LastWriteTime;  // 更新日時
DateTime dateTime3 = fileInfo.LastAccessTime; // アクセス日時
FileAttributes attributes = fileInfo.Attributes; // 属性

long size = fileInfo.Length; // サイズ
FileSystemInfo.CreationTime プロパティ (System.IO) | MSDN

ファイルのロック状態の検出

ロックされているかどうかは、アクセス時に発生する例外から調べられます。

try
{
    using (File.Open(filePath, FileMode.Open)) { }
}
catch (IOException e)
{
    int errorCode = e.HResult & 0xffff;
    if (errorCode == 0x20 || errorCode == 0x21)
    {
        // ロックされている
    }
}

.NET 4.5より前はException.HResultのアクセス修飾子がprotectedとなっているため、それの代わりに

int errorCode = Marshal.GetHRForException(e) & 0xffff;

のようにGetHRForException()から取得する必要があります。Community Additions - Exception.HResult Property (System)

[SecurityCriticalAttribute]
public static int GetHRForException(
    Exception e
)
Marshal.GetHRForException メソッド (Exception) (System.Runtime.InteropServices) | MSDN

エラーコードの意味は、それぞれ下表のように定義されています。

コード 定数 意味
32 (0x20) ERROR_SHARING_VIOLATION 他のプロセスによって使用されているため、プロセスはファイルにアクセスできない。共有違反
33 (0x21) ERROR_LOCK_VIOLATION 他のプロセスがファイルの一部をロックしているため、プロセスはファイルにアクセスできない。
System Error Codes (0-499) (Windows) | MSDN

Directory

メソッド 機能
 
メソッド - Directory Class (System.IO) | Microsoft Docs

ディレクトリの作成

メソッド 機能
CreateDirectory(String) 指定のディレクトリが存在していないならば、サブディレクトリも含めて作成する。さもなくば何もしない
CreateDirectory(String, DirectorySecurity) 指定のセキュリティでディレクトリを作成する。
オーバーロード - Directory.CreateDirectory Method (System.IO) | Microsoft Docs
public static DirectoryInfo CreateDirectory(
    string path
)
Directory.CreateDirectory メソッド (String) (System.IO) | MSDN

pathにはディレクトリのパスを指定します。これをファイルのパスとすると、それがディレクトリ名と解釈されて作成されます。つまり"c:\dir\sample.txt"と指定すると、c:\dirにsample.txtの名前のディレクトリが作成されます。これを適切に処理するには、GetDirectoryName()でディレクトリ名の部分のみを取得してから渡すようにします。

Directory.CreateDirectory(Path.GetDirectoryName(path));

ディレクトリの削除

Delete()で削除できます。

public static void Delete(
    string path
)
public static void Delete(
    string path,
    bool recursive
)
Directory.Delete メソッド (System.IO) | MSDN

指定パスが空ならばいずれのメソッドでも削除できますが、そうではない場合には2番目のメソッドでrecursiveをtrueとしなければ、「ディレクトリが空ではありません。」としてSystem.IO.IOExceptionが発生します。

ディレクトリの存在確認

public static bool Exists (string path);
Directory.Exists(String) Method (System.IO) | Microsoft Docs

指定ディレクトリが存在しているならば、trueが返されます。次のような場合はfalseとなります。

  • ディレクトリが存在しない
  • 指定されたのがディレクトリではない
  • 確認時に次のような理由によりエラーが発生した
    • ファイル名に無効な文字が含まれている
    • ファイル名が長すぎる
    • ディスクの障害または喪失
    • ファイルの読み取り権限がない

確認前に末尾の空白は削除されます。大文字/小文字は区別されません。

string path = @"C:\dir\sample.txt";

bool result1 = Directory.Exists(path);                        // false
bool result2 = Directory.Exists(Path.GetDirectoryName(path)); // true

bool result3 = Directory.Exists("sample.txt");                // false

作業ディレクトリ (working directory)

public static string GetCurrentDirectory()
Directory.GetCurrentDirectory メソッド (System.IO) | MSDN
public static void SetCurrentDirectory( string path )
Directory.SetCurrentDirectory メソッド (String) (System.IO) | MSDN

現在の作業ディレクトリ (current working directory) の取得と設定を行えます。これはEnvironment.CurrentDirectoryプロパティへの読み書きでも可能です。

設定時には、末尾の空白とバックスラッシュは削除されます。

Directory.SetCurrentDirectory("C:\\dir");
string dir1 = Directory.GetCurrentDirectory(); // "C:\\dir"

Directory.SetCurrentDirectory("C:\\dir ");
string dir2 = Directory.GetCurrentDirectory(); // "C:\\dir"

Directory.SetCurrentDirectory("C:\\dir\\");
string dir3 = Directory.GetCurrentDirectory(); // "C:\\dir"

なおVisual Studioでのデバッグ時に設定するだけならば、プロジェクトのプロパティを開き[デバッグ]タブの[作業ディレクトリ]でも設定できます。ただしこの設定は、単体テストのデバッグには適用されません。C# デバッグ構成のプロジェクト設定 | MSDN

C++での作業ディレクトリへのアクセス

アプリケーションのディレクトリ

Assembly.Locationからアプリケーションの実行ファイルのパスを取得し、そのディレクトリ名の部分を取得することで得られます。c# - How can I get the application's path in a .NET console application? - Stack Overflow

System.Reflection.Assembly assembly = typeof(MyProgram).Assembly;
string directory = Path.GetDirectoryName(assembly.Location);

指定パスがディレクトリかどうかの判別

File.Exists()で真ならばファイル、Directory.Exists()で真ならばディレクトリです。File.Exists メソッド (String) (System.IO) | MSDN

if(File.Exists(path))
{
    // pathはファイル
}
else if(Directory.Exists(path))
{
    // pathはディレクトリ
}
else
{
    // pathはファイルでもディレクトリでもない
}
Directory.Exists メソッド (String) (System.IO) | MSDN

Path

メソッド 取得できる情報
GetFileName(String) ファイル名 (拡張子あり)
GetFileNameWithoutExtension(String) ファイル名 (拡張子なし)
GetDirectoryName(String) ディレクトリ名
GetExtension(String) 拡張子
GetFullPath(String) 絶対パス
メソッド - Path クラス (System.IO) | MSDN
string path = @"c:\dir\sample.txt";

Path.GetFileName(path);                  // sample.txt
Path.GetFileNameWithoutExtension(path);  // sample

Path.GetDirectoryName(path);             // c:\dir
Path.GetExtension(path);                 // .txt

Path.GetFullPath("TEST.txt");
// c:\Users\name\documents\visual studio 2015\Projects\test\test\bin\x86\Debug\TEST.txt
メソッド 機能
GetInvalidFileNameChars() ファイル名に使用できない文字を含む配列を取得できる
(無効な文字はファイルシステムに依存するため、正確性は保証されない) Remarks - Path.GetInvalidFileNameChars Method (System.IO) | Microsoft Docs
GetInvalidPathChars() パス名に使用できない文字を含む配列を取得できる
(無効な文字はファイルシステムに依存するため、正確性は保証されない)

一時フォルダ

public static string GetTempPath()
Path.GetTempPath メソッド (System.IO) | MSDN

現在のユーザーの一時フォルダのパスを取得できます。どのパスを用いるかは、以下の順で決定されます。

  1. 環境変数 TMP
  2. 環境変数 TEMP (Windows Vista以降では、%LOCALAPPDATA%\Tempが既定値)
  3. 環境変数 USERPROFILE
  4. Windowsディレクトリ
public static string GetTempFileName()
Path.GetTempFileName メソッド (System.IO) | MSDN
public static string GetRandomFileName()
Path.GetRandomFileName メソッド (System.IO) | MSDN
  • GetTempFileName() … GetTempPath()で得られるパスに、無作為な名前に.tmpの拡張子を付けたファイルを作成し、そのパスを返す
  • GetRandomFileName() … フォルダ名またはファイル名として使用できる、無作為な名前を返す。たとえばkpvfojym.mqysdovvkjv.nfqといった名前
MSDN (Microsoft Developer Network) から検索