ファイル

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

File

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

ファイルの作成

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

メソッド 機能
Create(String) 読み取り、書き込み用に、ファイルを作成。すでに存在する場合は上書き
CreateText(String) 書き込み用に、テキストファイルを作成。すでに存在する場合は上書き
このメソッドは、StreamWriter(String, false)の呼び出しに等しい

ファイルのオープン

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

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

ファイルの削除

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

public static void Delete(
    string path
)
File.Delete メソッド (String) (System.IO) | MSDN

使用中などの理由により削除に失敗したときは例外が発生しますが、存在しないため削除できなかったときは例外は発生せず、何も通知されません。

ファイルの存在確認

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)
File.GetCreationTime メソッド (String) (System.IO) | MSDN

FileInfo

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

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

DateTime dateTime1i = fileInfo.CreationTime;   // 作成日時
DateTime dateTime2i = fileInfo.LastWriteTime;  // 更新日時
DateTime dateTime3i = fileInfo.LastAccessTime; // アクセス日時

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:\sample\test.txt"と指定すると、c:\sampleにtest.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

作業ディレクトリ (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:\\test");
string dir1 = Directory.GetCurrentDirectory(); // "C:\\test"

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

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

なお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:\temp\MyTest.txt";

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

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

Path.GetFullPath("Test.txt");
// c:\Users\name\documents\visual studio 2015\Projects\test\test\bin\x86\Debug\Test.txt

一時フォルダ

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) から検索