ファイル処理と I/O (C++/CLI)File Handling and I/O (C++/CLI)

.NET Framework を使ったさまざまなファイル操作について説明します。Demonstrates various file operations using the .NET Framework.

次のトピックでは、System.IO 名前空間で定義されたクラスを使用してさまざまなファイル操作を実行する方法について説明します。The following topics demonstrate the use of classes defined in the System.IO namespace to perform various file operations.

ディレクトリ内のファイルを列挙するEnumerate Files in a Directory

ディレクトリ内のファイル リストを取得する方法を次のコード例に示します。The following code example demonstrates how to retrieve a list of the files in a directory. また、サブディレクトリも列挙します。Additionally, the subdirectories are enumerated. GetFilesGetFiles メソッドと GetDirectories メソッドを使用して、C:\Windows ディレクトリの内容を表示する方法を次のコード例に示します。The following code example uses the GetFilesGetFiles and GetDirectories methods to display the contents of the C:\Windows directory.

Example

// enum_files.cpp
// compile with: /clr
using namespace System;
using namespace System::IO;

int main()
{
   String^ folder = "C:\\";
   array<String^>^ dir = Directory::GetDirectories( folder );
   Console::WriteLine("--== Directories inside '{0}' ==--", folder);
   for (int i=0; i<dir->Length; i++)
      Console::WriteLine(dir[i]);

   array<String^>^ file = Directory::GetFiles( folder );
   Console::WriteLine("--== Files inside '{0}' ==--", folder);
   for (int i=0; i<file->Length; i++)
      Console::WriteLine(file[i]);

   return 0;
}

ファイルシステムの変更の監視Monitor File System Changes

次のコード例では、を使用し FileSystemWatcher て、作成、変更、削除、または名前を変更するファイルに対応するイベントを登録します。The following code example uses FileSystemWatcher to register for events corresponding to files being created, changed, deleted, or renamed. ファイルへの変更をディレクトリに定期的にポーリングするのではなく、クラスを使用して、 FileSystemWatcher 変更が検出されたときにイベントを発生させることができます。Instead of periodically polling a directory for changes to files, you can use the FileSystemWatcher class to fire events when a change is detected.

Example

// monitor_fs.cpp
// compile with: /clr
#using <system.dll>

using namespace System;
using namespace System::IO;

ref class FSEventHandler
{
public:
    void OnChanged (Object^ source, FileSystemEventArgs^ e)
    {
        Console::WriteLine("File: {0} {1}",
               e->FullPath, e->ChangeType);
    }
    void OnRenamed(Object^ source, RenamedEventArgs^ e)
    {
        Console::WriteLine("File: {0} renamed to {1}",
                e->OldFullPath, e->FullPath);
    }
};

int main()
{
   array<String^>^ args = Environment::GetCommandLineArgs();

   if(args->Length < 2)
   {
      Console::WriteLine("Usage: Watcher.exe <directory>");
      return -1;
   }

   FileSystemWatcher^ fsWatcher = gcnew FileSystemWatcher( );
   fsWatcher->Path = args[1];
   fsWatcher->NotifyFilter = static_cast<NotifyFilters>
              (NotifyFilters::FileName |
               NotifyFilters::Attributes |
               NotifyFilters::LastAccess |
               NotifyFilters::LastWrite |
               NotifyFilters::Security |
               NotifyFilters::Size );

    FSEventHandler^ handler = gcnew FSEventHandler();
    fsWatcher->Changed += gcnew FileSystemEventHandler(
            handler, &FSEventHandler::OnChanged);
    fsWatcher->Created += gcnew FileSystemEventHandler(
            handler, &FSEventHandler::OnChanged);
    fsWatcher->Deleted += gcnew FileSystemEventHandler(
            handler, &FSEventHandler::OnChanged);
    fsWatcher->Renamed += gcnew RenamedEventHandler(
            handler, &FSEventHandler::OnRenamed);

    fsWatcher->EnableRaisingEvents = true;

    Console::WriteLine("Press Enter to quit the sample.");
    Console::ReadLine( );
}

バイナリファイルの読み取りRead a Binary File

次のコード例では、System.IO の名前空間の 2 つのクラス FileStreamBinaryReader を使用して、ファイルからバイナリ データを読み取る方法を示します。The following code example shows how to read binary data from a file, by using two classes from the System.IO namespace: FileStream and BinaryReader. FileStream は実際のファイルを表し、FileStream represents the actual file. BinaryReader はバイナリへのアクセスを可能にするストリームへのインターフェイスを提供します。BinaryReader provides an interface to the stream that allows binary access.

このコード例は、data.bin という名前のファイルを読み取り、整数をバイナリ形式で含めます。The code example reads a file that's named data.bin and contains integers in binary format. この種類のファイルの詳細については、「 方法: バイナリファイルを書き込む (C++/cli)」を参照してください。For information about this kind of file, see How to: Write a Binary File (C++/CLI).

Example

// binary_read.cpp
// compile with: /clr
#using<system.dll>
using namespace System;
using namespace System::IO;

int main()
{
   String^ fileName = "data.bin";
   try
   {
      FileStream^ fs = gcnew FileStream(fileName, FileMode::Open);
      BinaryReader^ br = gcnew BinaryReader(fs);

      Console::WriteLine("contents of {0}:", fileName);
      while (br->BaseStream->Position < br->BaseStream->Length)
         Console::WriteLine(br->ReadInt32().ToString());

      fs->Close( );
   }
   catch (Exception^ e)
   {
      if (dynamic_cast<FileNotFoundException^>(e))
         Console::WriteLine("File '{0}' not found", fileName);
      else
         Console::WriteLine("Exception: ({0})", e);
      return -1;
   }
   return 0;
}

テキストファイルの読み取りRead a Text File

StreamReader クラスを使用して、テキスト ファイルを一度に 1 行ずつ開いて読み取る方法を次の例に示します。このクラスは、System.IO 名前空間で定義されています。The following code example demonstrates how to open and read a text file one line at a time, by using the StreamReader class that's defined in the System.IO namespace. このクラスのインスタンスを使用してテキスト ファイルを開いてから、System.IO.StreamReader.ReadLine メソッドを使用して各行を取得します。An instance of this class is used to open a text file and then the System.IO.StreamReader.ReadLine method is used to retrieve each line.

このコード例では、テキストが含まれる textfile.txt というファイルを読み取ります。This code example reads a file that's named textfile.txt and contains text. この種類のファイルの詳細については、「 方法: テキストファイルを書き込む (C++/cli)」を参照してください。For information about this kind of file, see How to: Write a Text File (C++/CLI).

Example

// text_read.cpp
// compile with: /clr
#using<system.dll>
using namespace System;
using namespace System::IO;

int main()
{
   String^ fileName = "textfile.txt";
   try
   {
      Console::WriteLine("trying to open file {0}...", fileName);
      StreamReader^ din = File::OpenText(fileName);

      String^ str;
      int count = 0;
      while ((str = din->ReadLine()) != nullptr)
      {
         count++;
         Console::WriteLine("line {0}: {1}", count, str );
      }
   }
   catch (Exception^ e)
   {
      if (dynamic_cast<FileNotFoundException^>(e))
         Console::WriteLine("file '{0}' not found", fileName);
      else
         Console::WriteLine("problem reading file '{0}'", fileName);
   }

   return 0;
}

ファイル情報の取得Retrieve File Information

FileInfo クラスのコード例を次に示します。The following code example demonstrates the FileInfo class. ファイル名がわかっている場合、このクラスを使用して、ファイル サイズ、ディレクトリ、完全名、ファイルの作成日時や最終更新日時などのファイル情報を取得できます。When you have the name of a file, you can use this class to retrieve information about the file such as the file size, directory, full name, and date and time of creation and of the last modification.

このコードは、Notepad.exe 用のファイル情報を取得します。This code retrieves file information for Notepad.exe.

Example

// file_info.cpp
// compile with: /clr
using namespace System;
using namespace System::IO;

int main()
{
   array<String^>^ args = Environment::GetCommandLineArgs();
   if (args->Length < 2)
   {
      Console::WriteLine("\nUSAGE : file_info <filename>\n\n");
      return -1;
   }

   FileInfo^ fi = gcnew FileInfo( args[1] );

   Console::WriteLine("file size: {0}", fi->Length );

   Console::Write("File creation date:  ");
   Console::Write(fi->CreationTime.Month.ToString());
   Console::Write(".{0}", fi->CreationTime.Day.ToString());
   Console::WriteLine(".{0}", fi->CreationTime.Year.ToString());

   Console::Write("Last access date:  ");
   Console::Write(fi->LastAccessTime.Month.ToString());
   Console::Write(".{0}", fi->LastAccessTime.Day.ToString());
   Console::WriteLine(".{0}", fi->LastAccessTime.Year.ToString());

   return 0;
}

バイナリファイルを書き込むWrite a Binary File

バイナリ データをファイルに書き込む方法を次のコード例に示します。The following code example demonstrates writing binary data to a file. System.IO 名前空間の 2 つのクラス、FileStreamBinaryWriter が使用されます。Two classes from the System.IO namespace are used: FileStream and BinaryWriter. FileStream は実際のファイルを表し、BinaryWriter はバイナリへのアクセスを可能にするストリームへのインターフェイスを提供します。FileStream represents the actual file, while BinaryWriter provides an interface to the stream that allows binary access.

バイナリ形式の整数を含むファイルを書き込む方法を次のコード例に示します。The following code example writes a file containing integers in binary format. このファイルは、「 方法: バイナリファイルを読み取る (C++/cli)」のコードを使用して読み取ることができます。This file can be read with the code in How to: Read a Binary File (C++/CLI).

Example

// binary_write.cpp
// compile with: /clr
#using<system.dll>
using namespace System;
using namespace System::IO;

int main()
{
   array<Int32>^ data = {1, 2, 3, 10000};

   FileStream^ fs = gcnew FileStream("data.bin", FileMode::Create);
   BinaryWriter^ w = gcnew BinaryWriter(fs);

   try
   {
      Console::WriteLine("writing data to file:");
      for (int i=0; i<data->Length; i++)
      {
         Console::WriteLine(data[i]);
         w->Write(data[i]);
      }
   }
   catch (Exception^)
   {
     Console::WriteLine("data could not be written");
     fs->Close();
     return -1;
   }

   fs->Close();
   return 0;
}

テキストファイルの書き込みWrite a Text File

テキスト ファイルを作成し、StreamWriter クラスを使用してそのファイルにテキストを書き込む方法を次の例に示します。このクラスは、System.IO 名前空間で定義されています。The following code example demonstrates how to create a text file and write text to it using the StreamWriter class, which is defined in the System.IO namespace. StreamWriter コンストラクターは、作成されるファイル名を受け取ります。The StreamWriter constructor takes the name of the file to be created. ファイルが存在する場合、そのファイルに上書きされます (ただし、2 番目の StringWriter コンストラクター引数として True を渡す場合は例外です)。If the file exists, it is overwritten (unless you pass True as the second StringWriter constructor argument).

次に、Write 関数と WriteLine 関数を使用してファイルが保存されます。The file is then filed using the Write and WriteLine functions.

Example

// text_write.cpp
// compile with: /clr
using namespace System;
using namespace System::IO;

int main()
{
   String^ fileName = "textfile.txt";

   StreamWriter^ sw = gcnew StreamWriter(fileName);
   sw->WriteLine("A text file is born!");
   sw->Write("You can use WriteLine");
   sw->WriteLine("...or just Write");
   sw->WriteLine("and do {0} output too.", "formatted");
   sw->WriteLine("You can also send non-text objects:");
   sw->WriteLine(DateTime::Now);
   sw->Close();
   Console::WriteLine("a new file ('{0}') has been written", fileName);

   return 0;
}

関連項目See also

C++/CLI を使用した .NET プログラミング (Visual C++).NET Programming with C++/CLI (Visual C++)
ファイルおよびストリーム入出力File and Stream I/O
System.IO 名前空間System.IO namespace