ファイルはディスクに保存された情報のコレクションです。ディレクトリ、フォルダは複数のファイルを整理する方法です。レジストリは、さまざまな構成情報がオペレーティングシステムのLand(データベース)に保存される場所です。
ファイルとディレクトリの管理
C#はSystem.IO
、名前空間内の関連クラスによって実装されるファイル管理とディレクトリ管理をサポートしています。これらのクラスは、コンテンツの入出力を担当しないため、StreamまたはTextReaderのサブクラスではありませんが、ディスクファイルとディレクトリを管理するために使用されます。
ファイルとディレクトリはSystem.IO
、名前空間内の6つのクラスで表されます。
- ①-
FileSystemInfo
FileInfoとDirectoryInfoの基本クラス - ②
File
操作するファイルのための-contains静的メソッド - ③-
FileInfo
ファイルを表現して操作するために使用されます - ④——
Directory
ディレクトリを操作するための静的メソッドが含まれています - ⑤-
DirectoryInfo
ディレクトリを表し、操作するために使用されます - 法律
Path
-パス情報を操作するために使用されます
1.FileSystemInfoクラス
FieSystemlnfoクラスは、FilelnfoおよびDirectorylnfoの基本クラスであり、ファイルおよびディレクトリを操作するために使用されます。このクラスは、ファイルやディレクトリで一般的に使用される多くのメソッドと属性を提供します。
2.ファイルクラス
次の表は、Fileクラスで提供されるメソッドです。
例:Fileクラスを直接使用してコンテンツを読み取り、各行を表示します。
using System;
using System.IO;
class FileOpenText
{
static void Main(){
StreamReader sr = File.OpenText(".\\FileOpenText.cs");
string contents = sr.ReadToEnd();
sr.Close();
string[] lines = contents.Split(new char[] {
'\n' });
for(int i = 0; i < lines.Length; i++)
Console.WriteLine(i + ":\t" + lines[i]);
}
}
けれどもFile.OpenText()
、それは非常に便利ですが、それは(そのような漢字GBコードなど)は、異なる符号化方式でいくつかのファイルに直接使用することはできませんFile.OpenText()
。これを使用でき、encodingメソッドをFileStream
パッケージにStreamReader
追加できます。StreamReader
オブジェクトを直接生成してencodingメソッド(などEncoding.Default
)を指定することもできます。
3.FileInfoクラス
FileInfo
このクラスは、ファイルパスを表すために使用されます。File
クラスとの違いは、そのすべてのメンバーが非static
特定であるということです。一部の関数はFile
、FileInfo
クラスまたはクラスで実装できます。注:Fileクラスのすべてのメソッドには、セキュリティチェックが必要です。同じファイルに対して多くの操作を実行する場合はFileInfo
、FileInfoオブジェクトが呼び出されるたびにセキュリティチェックを必要としないため、処理用のオブジェクトを作成する方が効率的です。
FileInfoクラスのメソッドとプロパティは、その親クラスからFileSystemInfo
継承されます。
4.ディレクトリクラス
Directory
このクラスは、ディレクトリの作成、削除、移動、コピー、一覧表示などの操作を含む、ディレクトリを操作できる静的メソッドを提供します。Directory
オブジェクトは、名前という既存のディレクトリをパスを表すために使用することができ、または新しいディレクトリを作成するために使用することができます。
5.DirectoryInfoクラス
DirectoryInfo
クラスはディレクトリを表すために使用されます。DirectoryInfo
オブジェクトは、いずれかの既存のディレクトリに名前を付けるために使用されるか、または新しいディレクトリを作成するために使用されるパスを表します。
6.パスクラス
Path
クラスを使用して、クロスプラットフォームの方法でファイルとディレクトリのパス名を処理します。このクラスのすべてのメソッドstatic
は同じです。
たとえば、ListAlFiles.csは、ディレクトリ内のすべてのファイルを再帰的に一覧表示します。
using System;
using System.IO;
class ListAllFiles
{
public static void Main(){
ListFiles(new DirectoryInfo(@"C:\Users\Frenkie\Desktop"));
}
public static void ListFiles(FileSystemInfo info) {
if (!info.Exists) return;
DirectoryInfo dir = info as DirectoryInfo;
if (dir == null) return; // 不是目录
FileSystemInfo[] files = dir.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++) {
FileInfo file = files[i] as FileInfo;
if (file != null) // 是文件
Console.WriteLine(file.FullName + "\t" + file.Length);
else // 是目录
ListFiles(files[i]);// 对于子目录, 进行递归调用
}
}
}
ファイルとディレクトリへの変更を監視する
1.FileSystemWatcherクラス
FileSystemWatcher
非常に便利なクラスであり、指定されたディレクトリ内のファイルとサブディレクトリの変更を監視できます。検出されたディレクトリは、ローカルマシン、ネットワークドライブ、またはリモートマシンのディレクトリである可能性があります。
プログラムでFileSystemWatcher
オブジェクトを作成して、指定したディレクトリを監視できます。監視対象ディレクトリ内のファイルまたはサブディレクトリが作成、変更、または削除されると、オブジェクトは応答としてイベントを生成できます。
2.パスとフィルターの属性
FileSystemWatcher
のPath
属性は、監視するディレクトリを示します。
Filter
この属性は、ディレクトリ内の特定のファイルを監視するために指定するために使用されます。たとえば、テキストファイルの変更を監視する場合は、Filterプロパティをに設定する必要があります"*.txt"
。特定のファイルのみが監視されている場合は、そのファイル名が使用されます。すべてのファイルの変更を監視するには、Filterプロパティを空の文字列(""
)に設定する必要があります。IncludeSubdirectories
この属性は、サブディレクトリを含めるかどうかを示すために使用されます。
3.NotifyFiltersプロパティ
ディレクトリまたはファイルのいくつかの変更を監視できます。たとえば、属性、LastWriteの日時、またはファイルやディレクトリのサイズの変更を監視できます。これは、FileSystemWatcher.NotifyFilter
属性をNotifyFilters
値の1つまたはそれらの組み合わせに設定することで実現されます。
4.イベント
ファイルやディレクトリが変更さFileSystemWatcher
れると、イベントを生成して応答できます。このとき、クライアントコードはイベントハンドラコードを実行する必要があります。
一般的なファイルシステム操作により、複数のイベントが発生する場合があります。たとえば、あるディレクトリから別のディレクトリにファイルがある場合、いくつかのイベントChanged
だけでなく、いくつかのイベントもトリガーされる可能性がCreated
ありDeleted
ます。ファイルの移動は、複数の単純な操作を含む複雑な操作であるため、複数のイベントがトリガーされます。同様に、一部のアプリケーション(ウイルス対策ソフトウェアなど)では、FileSystemWatcher
追加のファイルシステムイベントが検出される場合があります。
イベント処理のために使用する薬剤であるFileSystemEventHandler
とRenamedEventHandler
。イベント処理関数のパラメーターに加えobject sender
て、FileSystemEventArgs
イベント関連の情報を含む別のオブジェクトがあります。FieSystemEventArgsの最も便利なプロパティは次のとおりです。
- ①-
FullPath
イベントの原因となったファイルまたはディレクトリのフルパスが含まれています - ②
Name
--onlyファイルまたはディレクトリの名前を含めます - ③
ChangeType
変更の種類を--Inform
RenamedEventArgs
最も一般的に使用される属性があるOldFullPah
とFullPah
、元の名前と名前後に、それぞれ、。
セットアッププログラムのEnableRaisingEvents
プロパティtrue
が表示されると、監視が開始されます。
イベントが多すぎて速すぎると、システムがより多くのバッファを必要とし、システム効率が低下する可能性があることに注意してください。したがって、合理的な使用Filter
、NotifyFilter
およびIncludeSubdirectories
プロパティを使用して、不要な変更通知を除外できます。
たとえば、Watcher。csはFileSystemWatcherを使用してファイルの変更を監視します。
using System;
using System.IO;
class Watcher
{
public static void TestMain() {
const string path = @"E:\Visual Studio 2019\C#\Mooc学习\ConsoleApp18流、文件IO\bin\Debug";
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.Filter = "*.txt";
watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite | NotifyFilters.FileName |
NotifyFilters.DirectoryName;
// 事件处理函数
watcher.Changed += OnChanged;
watcher.Created += OnChanged;
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// 开始监视
watcher.EnableRaisingEvents = true;
// 等待用户输入q才结束程序
Console.WriteLine("Press'q' to quit the sample.");
while (Console.Read() != 'q') {
}
}
// 事件处理函数
private static void OnChanged(object sender, FileSystemEventArgs e) {
// 显示哪些文件做了何种修改
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object sender, RenamedEventArgs e) {
// 显示被更改的文件名
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
}
レジストリ
たとえば、RegistryDemo.csはレジストリを取得および設定します。
using Microsoft.Win32;
using System;
class RegistryDemo
{
public static void TestMain() {
// 获取信息
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main");
string page = key.GetValue("Start Page") as string;
Console.WriteLine("浏览器的起始页是" + page);
// 设置信息
RegistryKey test = Registry.CurrentUser.CreateSubKey("MyTest");
using (RegistryKey mySetting = test.CreateSubKey("MySetting")) {
mySetting.SetValue("ID", 123);
mySetting.SetValue("Language", "Chinese");
mySetting.SetValue("WindowSize", "Max");
mySetting.SetValue("LastLogin", DateTime.Now.ToString());
}
// 查询信息
RegistryKey setting = Registry.CurrentUser.OpenSubKey(@"MyTest\MySetting");
foreach (string name in setting.GetValueNames())
Console.WriteLine(name + ":" + setting.GetValue(name));
}
}
操作結果:
実際の作業では、プログラム内のいくつかの設定項目をレジストリに保存し、次回実行時にレジストリからこれらの登録項目を読み取ることができます。
注:レジストリを操作すると、システム障害が発生する可能性があります。Windowsレジストリに慣れていない場合は、レジストリを自由に操作しないようにしてください。さらに、一部のレジストリエントリでは、特定のアクセス許可を変更する必要があります。