آموزش سی شارپ - فایل ها
یک فایل (file) مجموعهای از دادهها است که با یک نام خاص و مسیر دایرکتوری در دیسک ذخیره میشود. هنگامی که یک فایل برای خواندن یا نوشتن باز میشود، به یک جریان (stream) تبدیل میشود.
جریان اصلاحاً توالی بایتهایی است که از طریق مسیر ارتباطی میگذرد. دو جریان اصلی وجود دارند: جریان ورودی (input stream) و جریان خروجی (output stream). جریان ورودی برای خواندن دادهها از فایل (عملیات خواندن) استفاده میشود و جریان خروجی برای نوشتن در فایل (عملیات نوشتن) استفاده میشود.
کلاسهای ورود و خروج فایل در C#
فضاینام System.IO دارای کلاسهای مختلفی است که برای انجام عملیاتهای مختلف با فایلها استفاده میشوند، از جمله ایجاد و حذف فایلها، خواندن از یک فایل و نوشتن در یک فایل، بستن فایل و غیره.
جدول زیر نمایشی از برخی از کلاسهای غیر انتزاعی رایج در فضاینام System.IO را نشان میدهد:
شماره | کلاس و توضیحات ورود و خروج |
---|---|
1 |
BinaryReader از یک جریان باینری، دادههای ابتدایی را خوانده و استخراج میکند. |
2 |
BinaryWriter از دادههای ابتدایی، اطلاعات را به فرمت باینری نوشته و ذخیره میکند. |
3 |
BufferedStream یک حافظه موقت برای جریان بایتهاست. |
4 |
Directory در عملیات تغییر در ساختار دایرکتوری کمک میکند. |
5 |
DirectoryInfo برای انجام عملیات بر روی دایرکتوریها استفاده میشود. |
6 |
DriveInfo اطلاعات درباره درایوها را ارائه میدهد. |
7 |
File در عملیات تغییر در فایلها کمک میکند. |
8 |
FileInfo برای انجام عملیات بر روی فایلها استفاده میشود. |
9 |
FileStream برای خواندن از و نوشتن به هر مکانی در فایل استفاده میشود. |
10 |
MemoryStream برای دسترسی تصادفی به دادههای جریانی که در حافظه ذخیره شدهاند استفاده میشود. |
11 |
Path عملیاتی را بر روی اطلاعات مسیر انجام میدهد. |
12 |
StreamReader برای خواندن کاراکترها از جریان بایت استفاده میشود. |
13 |
StreamWriter برای نوشتن کاراکترها به جریان استفاده میشود. |
14 |
StringReader برای خواندن از یک بافر رشته استفاده میشود. |
15 |
StringWriter برای نوشتن در یک بافر رشته استفاده میشود. |
کلاس FileStream
کلاس FileStream در فضاینام System.IO در خواندن از و نوشتن به فایلها کمک میکند و فایلها را می بندد. این کلاس از کلاس انتزاعی Stream مشتق میشود.
برای ایجاد یک فایل جدید یا باز کردن یک فایل موجود، شما باید یک شیء FileStream ایجاد کنید. ساختار ایجاد شیء FileStream به صورت زیر است:
FileStream <object_name> = new FileStream( <file_name>, <FileMode Enumerator>,
<FileAccess Enumerator>, <FileShare Enumerator>);
به عنوان مثال، ما یک شیء FileStream با نام F برای خواندن یک فایل به نام sample.txt را ایجاد میکنیم که نشان داده شده است −
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read,
FileShare.Read);
ش.ر. | پارامتر و توضیحات |
---|---|
1 |
FileMode شمارنده FileMode روشهای مختلفی را برای باز کردن فایلها تعریف میکند. اعضای شمارنده FileMode به شرح زیر هستند:
|
2 |
FileAccess شمارنده FileAccess شامل اعضا: Read، ReadWrite و Write است. |
3 |
FileShare شمارنده FileShare شامل اعضای زیر است:
|
مثال
برنامه زیر استفاده از کلاس FileStream را نشان میدهد −
using System;
using System.IO;
namespace FileIOApplication {
class Program {
static void Main(string[] args) {
FileStream F = new FileStream("test.dat", FileMode.OpenOrCreate,
FileAccess.ReadWrite);
for (int i = 1; i <= 20; i++) {
F.WriteByte((byte)i);
}
F.Position = 0;
for (int i = 0; i <= 20; i++) {
Console.Write(F.ReadByte() + " ");
}
F.Close();
Console.ReadKey();
}
}
}
هنگامی که کد بالا کامپایل و اجرا می شود، نتیجه زیر را ایجاد می کند -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -1
عملیات پیشرفته فایل در C#
مثال پیشین عملیات ساده فایل را در C# ارائه میدهد. اما برای بهرهبرداری از قدرتهای فراوان کلاسهای System.IO در C#، باید خواص و روشهای رایج این کلاسها را بشناسید.
ش.ر. | موضوع و توضیحات |
---|---|
1 | خواندن از و نوشتن در فایلهای متنی
شامل خواندن از و نوشتن در فایلهای متنی است. کلاسهای StreamReader و StreamWriter در این کار کمک میکنند. |
2 | خواندن از و نوشتن در فایلهای باینری
شامل خواندن از و نوشتن در فایلهای باینری است. کلاسهای BinaryReader و BinaryWriter در این کار کمک میکنند. |
3 | تغییر ساختار فایلهای سیستم ویندوز
به برنامهنویس C# امکان میدهد تا بتواند در فایلها و دایرکتوریهای سیستم ویندوز مرور و مکانیابی کند. |
خواندن از و نوشتن به فایلهای متنی در C#
کلاسهای StreamReader و StreamWriter برای خواندن از و نوشتن دادهها به فایلهای متنی استفاده میشوند. این کلاسها از کلاس پایه انتزاعی Stream ارثبری میکنند که از خواندن و نوشتن بایتها به یک جریان فایل پشتیبانی میکند.
کلاس StreamReader
کلاس StreamReader همچنین از کلاس پایه انتزاعی TextReader که یک خواننده برای خواندن سری کاراکترها را نمایش میدهد، ارثبری میکند. جدول زیر توضیحی از برخی از متدهای معمول کلاس StreamReader را نشان میدهد:
ردیف | متد و توضیحات |
---|---|
۱ |
public override void Close() این متد شیء StreamReader و جریان زیرین را بسته و هر منبع سیستمی مرتبط با خواننده را آزاد میکند. |
۲ |
public override int Peek() کاراکتر بعدی قابل دسترس را برمیگرداند، اما آن را مصرف نمیکند. |
۳ |
public override int Read() کاراکتر بعدی از جریان ورودی را خوانده و مکان قرارگیری کاراکتر را یک واحد افزایش میدهد. |
مثال
مثال زیر نحوه خواندن یک فایل متنی با نام Jamaica.txt را نمایش میدهد. محتوای فایل به صورت زیر است:
Down the way where the nights are gay
And the sun shines daily on the mountain top
I took a trip on a sailing ship
And when I reached Jamaica
I made a stop
using System;
using System.IO;
namespace FileApplication {
class Program {
static void Main(string[] args) {
try {
// Create an instance of StreamReader to read from a file.
// The using statement also closes the StreamReader.
using (StreamReader sr = new StreamReader("c:/jamaica.txt")) {
string line;
// Read and display lines from the file until
// the end of the file is reached.
while ((line = sr.ReadLine()) != null) {
Console.WriteLine(line);
}
}
} catch (Exception e) {
// Let the user know what went wrong.
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
}
}
حدس بزنید که وقتی برنامه را کامپایل و اجرا میکنید چه نتیجهای نمایش داده میشود!
کلاس StreamWriter
کلاس StreamWriter از کلاس انتزاعی TextWriter که یک نویسنده را نمایش میدهد و میتواند سری کاراکترها را بنویسد، ارثبری میکند.
جدول زیر توضیحی از متدهای معمول این کلاس را نشان میدهد:
ردیف | متد و توضیحات |
---|---|
۱ |
public override void Close() شیء فعلی StreamWriter و جریان زیرین را بسته میکند. |
۲ |
public override void Flush() تمام بافرها را برای نویسنده فعلی پاک کرده و باعث میشود دادههای بافرشده به جریان زیرین نوشته شود. |
۳ |
public virtual void Write(bool value) بازنمایی متنی یک مقدار بولین را در رشته یا جریان متنی نوشته میکند. (ارثبری شده از TextWriter.) |
۴ |
public override void Write(char value) یک کاراکتر را در جریان نوشته میکند. |
۵ |
public virtual void Write(decimal value) بازنمایی متنی یک مقدار دهدهی را در رشته یا جریان متنی نوشته میکند. |
۶ |
public virtual void Write(double value) بازنمایی متنی یک مقدار اعشاری ۸ بایتی را در رشته یا جریان متنی نوشته میکند. |
۷ |
public virtual void Write(int value) بازنمایی متنی یک عدد صحیح ۴ بایتی را در رشته یا جریان متنی نوشته میکند. |
۸ |
public override void Write(string value) یک رشته را در جریان نوشته میکند. |
۹ |
public virtual void WriteLine() یک خط خاتمهگذار را در رشته یا جریان متنی نوشته میکند. |
برای لیست کاملی از متدها، می توانید به مستندات C# شرکت Microsoft مراجعه کنید.
مثال
مثال زیر نحوه نوشتن دادههای متنی به یک فایل با استفاده از کلاس StreamWriter را نشان میدهد:
using System;
using System.IO;
namespace FileApplication {
class Program {
static void Main(string[] args) {
string[] names = new string[] {"Sara", "Smith"};
using (StreamWriter sw = new StreamWriter("names.txt")) {
foreach (string s in names) {
sw.WriteLine(s);
}
}
// Read and show each line from the file.
string line = "";
using (StreamReader sr = new StreamReader("names.txt")) {
while ((line = sr.ReadLine()) != null) {
Console.WriteLine(line);
}
}
Console.ReadKey();
}
}
}
هنگامی که کد بالا کامپایل و اجرا می شود، نتیجه زیر را ایجاد می کند -
Sara
Nuha
خواندن از و نوشتن به فایلهای باینری
کلاسهای BinaryReader و BinaryWriter برای خواندن از و نوشتن به فایلهای باینری استفاده میشوند.
کلاس BinaryReader
کلاس BinaryReader برای خواندن دادههای باینری از یک فایل استفاده میشود. یک شیء BinaryReader با ارسال یک شیء FileStream به سازندهاش ایجاد میشود.
جدول زیر شرح متدهای معمول استفاده شده در کلاس BinaryReader را توضیح میدهد.
ردیف | متد و توضیحات |
---|---|
۱ |
public override void Close() شیء BinaryReader و جریان زیرین را بسته میکند. |
۲ |
public virtual int Read() کاراکترها را از جریان زیرین خوانده و موقعیت فعلی جریان را پیش میبرد. |
۳ |
public virtual bool ReadBoolean() مقدار بولین را از جریان فعلی خوانده و موقعیت فعلی جریان را یک بایت جلو میبرد. |
۴ |
public virtual byte ReadByte() بایت بعدی را از جریان فعلی خوانده و موقعیت فعلی جریان را یک بایت جلو میبرد. |
۵ |
public virtual byte[] ReadBytes(int count) تعداد مشخصی بایت را از جریان فعلی به یک آرایه بایت خوانده و موقعیت فعلی را به اندازه آن تعداد بایت جلو میبرد. |
۶ |
public virtual char ReadChar() کاراکتر بعدی را از جریان فعلی خوانده و موقعیت فعلی جریان را به تطابق با رمزگذاری استفاده شده و کاراکتر خاص خوانده شده از جریان پیش میبرد. |
۷ |
public virtual char[] ReadChars(int count) تعداد مشخصی کاراکتر را از جریان فعلی خوانده، داده را به صورت یک آرایه کاراکتر برمیگرداند و موقعیت فعلی را به تطابق با رمزگذاری استفاده شده و کاراکتر خاص خوانده شده از جریان پیش میبرد. |
۸ |
public virtual double ReadDouble() مقدار نقطه شناور 8 بایتی را از جریان فعلی خوانده و موقعیت فعلی جریان را 8 بایت جلو میبرد. |
۹ |
public virtual int ReadInt32() عدد صحیح 4 بایتی با علامت را از جریان فعلی خوانده و موقعیت فعلی جریان را 4 بایت جلو میبرد. |
۱۰ |
public virtual string ReadString() یک رشته را از جریان فعلی خوانده میشود. رشته با طولی که به عنوان یک عدد صحیح 7 بیتی به صورت یک بار رمزگذاری شده است. |
کلاس BinaryWriter
کلاس BinaryWriter برای نوشتن دادههای باینری به یک جریان استفاده میشود. یک شیء BinaryWriter با ارسال یک شیء FileStream به سازندهاش ایجاد میشود.
جدول زیر شرح متدهای معمول استفاده شده در کلاس BinaryWriter را توضیح میدهد.
ردیف | تابع و توضیحات |
---|---|
۱ |
public override void Close() شیء BinaryWriter و جریان زیرین را بسته میکند. |
۲ |
public virtual void Flush() همه بافرها را برای نویسنده فعلی پاک میکند و هر داده بافر شده را در دستگاه زیرین نوشته میکند. |
۳ |
public virtual long Seek(int offset, SeekOrigin origin) موقعیت داخل جریان فعلی را تنظیم میکند. |
۴ |
public virtual void Write(bool value) مقدار بولین یک بایتی را به جریان فعلی نوشته میکند، به طوری که ۰ نمایانگر غلط و ۱ نمایانگر درست است. |
۵ |
public virtual void Write(byte value) یک بایت بدون علامت را به جریان فعلی نوشته و موقعیت جریان را یک بایت جلو میبرد. |
۶ |
public virtual void Write(byte[] buffer) یک آرایه بایت را به جریان زیرین نوشته میکند. |
۷ |
public virtual void Write(char ch) یک کاراکتر یونیکد را به جریان فعلی نوشته و موقعیت فعلی جریان را به تطابق با رمزگذاری استفاده شده و کاراکترهای خاصی که در حالت نوشته شده به جریان هستند، پیش میبرد. |
۸ |
public virtual void Write(char[] chars) یک آرایه کاراکتر را به جریان فعلی نوشته و موقعیت فعلی جریان را به تطابق با رمزگذاری استفاده شده و کاراکترهای خاصی که در حالت نوشته شده به جریان هستند، پیش میبرد. |
۹ |
public virtual void Write(double value) مقدار اعشاری ۸ بایتی را به جریان فعلی نوشته و موقعیت جریان را ۸ بایت جلو میبرد. |
۱۰ |
public virtual void Write(int value) یک عدد صحیح ۴ بایتی با علامت را به جریان فعلی نوشته و موقعیت جریان را ۴ بایت جلو میبرد. |
۱۱ |
public virtual void Write(string value) یک رشته با پیشوند طولی به این جریان در رمزگذاری فعلی BinaryWriter نوشته و موقعیت فعلی جریان را به تطابق با رمزگذاری استفاده شده و کاراکترهای خاصی که در حالت نوشته شده به جریان هستند، پیش میبرد. |
برای مشاهده لیست کاملی از متدها، لطفاً به مستندات Microsoft C# مراجعه کنید.
مثال
مثال زیر نحوه خواندن و نوشتن دادههای باینری را نشان میدهد -
using System;
using System.IO;
namespace BinaryFileApplication {
class Program {
static void Main(string[] args) {
BinaryWriter bw;
BinaryReader br;
int i = 25;
double d = 3.14157;
bool b = true;
string s = "I am happy";
//create the file
try {
bw = new BinaryWriter(new FileStream("mydata", FileMode.Create));
} catch (IOException e) {
Console.WriteLine(e.Message + "\n Cannot create file.");
return;
}
//writing into the file
try {
bw.Write(i);
bw.Write(d);
bw.Write(b);
bw.Write(s);
} catch (IOException e) {
Console.WriteLine(e.Message + "\n Cannot write to file.");
return;
}
bw.Close();
//reading from the file
try {
br = new BinaryReader(new FileStream("mydata", FileMode.Open));
} catch (IOException e) {
Console.WriteLine(e.Message + "\n Cannot open file.");
return;
}
try {
i = br.ReadInt32();
Console.WriteLine("Integer data: {0}", i);
d = br.ReadDouble();
Console.WriteLine("Double data: {0}", d);
b = br.ReadBoolean();
Console.WriteLine("Boolean data: {0}", b);
s = br.ReadString();
Console.WriteLine("String data: {0}", s);
} catch (IOException e) {
Console.WriteLine(e.Message + "\n Cannot read from file.");
return;
}
br.Close();
Console.ReadKey();
}
}
}
هنگامی که کد بالا کامپایل و اجرا می شود، نتیجه زیر را ایجاد می کند -
Integer data: 25
Double data: 3.14157
Boolean data: True
String data: I am happy
C# - سیستم فایل ویندوز
C# به شما امکان میدهد با استفاده از کلاسهای مربوط به دایرکتوری و فایل مختلف مانند کلاس DirectoryInfo و کلاس FileInfo با فایلها و دایرکتوریها کار کنید.
کلاس DirectoryInfo
کلاس DirectoryInfo از کلاس FileSystemInfo مشتق میشود. این کلاس دارای روشهای مختلف برای ایجاد، جابجایی و مرور در دایرکتوریها و زیردایرکتوریها است. این کلاس قابل مشتق شدن نیست.
در زیر تعدادی از ویژگیهای معمول این کلاس آمده است −
ردیف | ویژگی و توضیحات |
---|---|
1 |
Attributes ویژگیهای فایل یا دایرکتوری فعلی را دریافت میکند. |
2 |
CreationTime زمان ایجاد فایل یا دایرکتوری فعلی را دریافت میکند. |
3 |
Exists مقدار بولینی را که نشاندهنده وجود دایرکتوری است، دریافت میکند. |
4 |
Extension رشتهای را که نمایندهٔ پسوند فایل است، دریافت میکند. |
5 |
FullName مسیر کامل دایرکتوری یا فایل را دریافت میکند. |
6 |
LastAccessTime زمانی که فایل یا دایرکتوری فعلی آخرین بار دسترسی شد، را دریافت میکند. |
7 |
Name نام این نمونه DirectoryInfo را دریافت میکند. |
در زیر تعدادی از روشهای معمول این کلاس آمده است −
ردیف | روش و توضیحات |
---|---|
1 |
public void Create() یک دایرکتوری ایجاد میکند. |
2 |
public DirectoryInfo CreateSubdirectory(string path) یک زیردایرکتوری یا زیردایرکتوریها را در مسیر مشخص شده ایجاد میکند. مسیر مشخص شده ممکن است نسبت به این نمونه از کلاس DirectoryInfo نسبی باشد. |
3 |
public override void Delete() اگر دایرکتوری خالی باشد، DirectoryInfo را حذف میکند. |
4 |
public DirectoryInfo[] GetDirectories() زیردایرکتوریهای دایرکتوری فعلی را برمیگرداند. |
5 |
public FileInfo[] GetFiles() لیستی از فایلها را از دایرکتوری فعلی برمیگرداند. |
برای مشاهدهٔ لیست کاملی از ویژگیها و روشها، لطفاً به مستندات C# شرکت مایکروسافت مراجعه کنید.
کلاس FileInfo
کلاس FileInfo از کلاس FileSystemInfo مشتق میشود. این کلاس دارای ویژگیها و روشهای نمونه برای ایجاد، کپی، حذف، جابجایی و باز کردن فایلها است و در ایجاد شیهای FileStream نیز کمک میکند. این کلاس قابل مشتق شدن نیست.
در زیر تعدادی از ویژگیهای معمول این کلاس آمده است −
ردیف | ویژگی و توضیحات |
---|---|
1 |
Attributes (ویژگیها) ویژگیهای فایل فعلی را دریافت میکند. |
2 |
CreationTime (زمانساخت) زمان ایجاد فایل فعلی را دریافت میکند. |
3 |
Directory (دایرکتوری) یک نمونه از دایرکتوری که فایل متعلق به آن است را دریافت میکند. |
4 |
Exists (وجود) یک مقدار بولین دریافت میکند که نشان میدهد آیا فایل وجود دارد یا خیر. |
5 |
Extension (پسوند) رشتهای را که نمایندهٔ پسوند فایل است، دریافت میکند. |
6 |
FullName (نام کامل) مسیر کامل فایل را دریافت میکند. |
7 |
LastAccessTime (زمان آخرین دسترسی) زمان آخرین دسترسی به فایل فعلی را دریافت میکند. |
8 |
LastWriteTime (زمان آخرین نوشتن) زمان آخرین فعالیت نوشتن در فایل را دریافت میکند. |
9 |
Length (اندازه) اندازهٔ فایل فعلی را بر حسب بایت دریافت میکند. |
10 |
Name (نام) نام فایل را دریافت میکند. |
در زیر تعدادی از روشهای معمول کلاس FileInfo آمده است −
ردیف | روش و توضیحات |
---|---|
1 |
public StreamWriter AppendText() یک StreamWriter را ایجاد میکند که متن را به فایل نمایندهٔ این نمونه از FileInfo الحاق میکند. |
2 |
public FileStream Create() یک فایل ایجاد میکند. |
3 |
public override void Delete() یک فایل را بطور دائمی حذف میکند. |
4 |
public void MoveTo(string destFileName) یک فایل مشخص را به مکان جدیدی منتقل میکند و امکان تعیین نام فایل جدید را فراهم میکند. |
5 |
public FileStream Open(FileMode mode) یک فایل را با حالت مشخص شده باز میکند. |
6 |
public FileStream Open(FileMode mode, FileAccess access) یک فایل را با حالت مشخص شده و دسترسی خواندن، نوشتن یا خواندن/نوشتن باز میکند. |
7 |
public FileStream Open(FileMode mode, FileAccess access, FileShare share) یک فایل را با حالت مشخص شده و دسترسی خواندن، نوشتن یا خواندن/نوشتن و گزینهٔ اشتراک مشخص شده باز میکند. |
8 |
public FileStream OpenRead() یک FileStream به صورت فقط خواندنی ایجاد میکند. |
9 |
public FileStream OpenWrite() یک FileStream به صورت فقط نوشتنی ایجاد میکند. |
برای دیدن لیست کاملی از ویژگیها و روشها، لطفاً به مستندات C# مایکروسافت مراجعه کنید.
مثال
مثال زیر استفاده از کلاسهای فوق را نشان میدهد −
using System;
using System.IO;
namespace WindowsFileApplication {
class Program {
static void Main(string[] args) {
//creating a DirectoryInfo object
DirectoryInfo mydir = new DirectoryInfo(@"c:\Windows");
// getting the files in the directory, their names and size
FileInfo [] f = mydir.GetFiles();
foreach (FileInfo file in f) {
Console.WriteLine("File Name: {0} Size: {1}", file.Name, file.Length);
}
Console.ReadKey();
}
}
}
وقتی برنامه را کامپایل و اجرا میکنید، نامهای فایلها و اندازهٔ مربوط به آنها در دایرکتوری ویندوز نمایش داده میشود.