منظورشون از تصادفی دسترسی به شیوه Random Access است، با اعداد تصادفی Random اشتباه گرفته نشود.
در شیوه دسترسی تصادفی به فایل، موقعیت داده ای که قصد خواندن یا نوشتن اش را داریم کاملا مشخص است،
مثلا در یک فایل 500 بایتی، 5 رکورد ذخیره شده که طول هر رکورد 100 بایت است. اگر بخواهیم رکورد چهارم را از
این فایل بخوانیم نیازی نیست که رکورد های قبل یا بعد از آن پردازش شوند، کافی است از ابتدای فایل 3 * 100 بایت
به جلو حرکت کرده و سپس 100 بایت را بخوانیم. این 100 بایتی که می خوانیم داده های رکورد چهارم خواهند بود.
سرعت خواندن و نوشتن در شیوه دسترسی تصادفی بالا است چون خواندن و نوشتن یک رکورد ارتباطی با موقعیت
آن رکورد در فایل ندارد و نیازی به پردازش سایر رکورد های داخل فایل نیست.
ابتدا یک کلاس بسازید که فیلد هایی که باید در هر رکورد ذخیره شوند را مشخص کنید. مثلا :
کد:
public class FileRecord
{
public int RecordID;
public string FirstName;
public string LastName;
public double Weight;
public DateTime Birthday;
}
اما این کافی نیست، چون باید برای خواندن و نوشتن رکورد در فایل بتوانیم داده های داخلش را به آرایه ای
از بایت ها تبدیل کنیم. پس به کلاس ویژگی Serializable را اضافه کرده و دو تابع برای تبدیل بین رکورد و آرایه ای
از بایت ها می نویسیم :
کد:
[Serializable()]
public class FileRecord
{
public int RecordID;
public string FirstName;
public string LastName;
public double Weight;
public DateTime Birthday;
public static FileRecord FromBytes(byte[] bytes)
{
try
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter;
formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream buffer = new System.IO.MemoryStream(bytes);
return (FileRecord)formatter.Deserialize(buffer);
}
catch
{
return null;
}
}
public byte[] Bytes()
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter;
formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream buffer = new System.IO.MemoryStream();
formatter.Serialize(buffer, this);
return buffer.ToArray();
}
};
تابع FromBytes می تواند یک آرایه ای از بایت ها را به رکورد تبدیل کند.
تابع Bytes می تواند رکورد را به آرایه ای از بایت ها تبدیل کند.
توجه داشته باشید که طول این آرایه بایت ها ثابت نیست، هر چه مقادیر فیلد ها بزرگتر باشند آرایه نیز بزرگتر خواهد شد.
حالا باید کلاسی بسازیم که این رکورد را در فایل مدیریت کند :
کد:
public class FileManager
{
public int RecordSize = 1024;
public FileManager(string path)
public void Clear()
public int Count
public FileRecord GetRecord(int index)
public void SetRecord(int index, FileRecord record)
public void Insert(FileRecord record)
public void Delete(int index)
public void Close()
};
طول رکورد ها باید ثابت باشند، پس توسط متغیر RecordSize طول آنها را بر حسب بایت مشخص می کنیم. از تغییر دادن
طول رکورد در میان عملیات ها خودداری کنید چون ساختار فایل را بهم خواهد ریخت. فقط زمانی مجاز به
تغییر دادن RecordSize هستید که فایل هیچ رکوردی نداشته باشد.
سازنده کلاس FileManager از شما مسیر فایل را خواهد خواست، مثلا C:\file.dat و اگر این فایل ایجاد نشده باشد
آنرا خواهد ساخت.
روتین Clear تمامی رکورد ها را حذف خواهد کرد.
GetRecord رکورد شماره فلان را از فایل می خواند، اندیس رکورد ها از 0 شروع می شوند.
SetRecord رکورد شماره فلان را در فایل می نویسد.
Insert یک رکورد به انتهای فایل اضافه می کند.
Delete رکورد شماره فلان را از فایل حذف می کند. اگر رکورد مذکور آخرین رکورد فایل نباشد، رکورد آخر فایل جای
آن قرار خواهد گرفت تا نیازی به جابجا کردن همه رکورد های بعدی نباشد و سرعت حذف کردن افزایش یابد.
Close فایل را خواهد بست. اصولا زمانی که دیگر کاری با فایل ندارید این روتین را اجرا خواهید کرد.
به پروژه پیوستی مراجعه کنید. ReadWriteBinaryRecord.zip