Share via


Penanganan File dan I/O (C++/CLI)

Menunjukkan berbagai operasi file menggunakan .NET Framework.

Topik berikut menunjukkan penggunaan kelas yang ditentukan dalam System.IO namespace layanan untuk melakukan berbagai operasi file.

Menghitung File dalam Direktori

Contoh kode berikut menunjukkan cara mengambil daftar file dalam direktori. Selain itu, subdirektori dijumlahkan. Contoh kode berikut menggunakan GetFilesGetFiles metode dan GetDirectories untuk menampilkan konten direktori C:\Windows.

Contoh

// 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;
}

Memantau Perubahan Sistem File

Contoh kode berikut menggunakan FileSystemWatcher untuk mendaftar peristiwa yang sesuai dengan file yang dibuat, diubah, dihapus, atau diganti namanya. Alih-alih secara berkala melakukan polling direktori untuk perubahan pada file, Anda dapat menggunakan FileSystemWatcher kelas untuk mengaktifkan peristiwa saat perubahan terdeteksi.

Contoh

// 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( );
}

Membaca File Biner

Contoh kode berikut menunjukkan cara membaca data biner dari file, dengan menggunakan dua kelas dari System.IO namespace: FileStream dan BinaryReader. FileStream mewakili file aktual. BinaryReader menyediakan antarmuka ke aliran yang memungkinkan akses biner.

Contoh kode membaca file yang bernama data.bin dan berisi bilangan bulat dalam format biner. Untuk informasi tentang file semacam ini, lihat Cara: Menulis File Biner (C++/CLI).

Contoh

// 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;
}

Membaca File Teks

Contoh kode berikut menunjukkan cara membuka dan membaca file teks satu baris sekaligus, dengan menggunakan StreamReader kelas yang ditentukan dalam System.IO namespace. Instans kelas ini digunakan untuk membuka file teks dan kemudian System.IO.StreamReader.ReadLine metode digunakan untuk mengambil setiap baris.

Contoh kode ini membaca file yang bernama textfile.txt dan berisi teks. Untuk informasi tentang file semacam ini, lihat Cara: Menulis File Teks (C++/CLI).

Contoh

// 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;
}

Mengambil Informasi File

Contoh kode berikut menunjukkan FileInfo kelas . Ketika Anda memiliki nama file, Anda dapat menggunakan kelas ini untuk mengambil informasi tentang file seperti ukuran file, direktori, nama lengkap, dan tanggal dan waktu pembuatan dan modifikasi terakhir.

Kode ini mengambil informasi file untuk Notepad.exe.

Contoh

// 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;
}

Menulis File Biner

Contoh kode berikut menunjukkan penulisan data biner ke file. Dua kelas dari System.IO namespace digunakan: FileStream dan BinaryWriter. FileStream mewakili file aktual, sambil BinaryWriter menyediakan antarmuka ke aliran yang memungkinkan akses biner.

Contoh kode berikut menulis file yang berisi bilangan bulat dalam format biner. File ini dapat dibaca dengan kode di Cara: Membaca File Biner (C++/CLI).

Contoh

// 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;
}

Menulis File Teks

Contoh kode berikut menunjukkan cara membuat file teks dan menulis teks ke dalamnya menggunakan StreamWriter kelas , yang ditentukan dalam System.IO namespace. StreamWriter Konstruktor mengambil nama file yang akan dibuat. Jika file ada, file akan ditimpa (kecuali Anda meneruskan True sebagai argumen konstruktor kedua StringWriter ).

File kemudian diajukan menggunakan Write fungsi dan WriteLine .

Contoh

// 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;
}

Baca juga

Pemrograman .NET dengan C++/CLI (Visual C++)
I/O File dan Aliran
System.IO namespace