جهت خواندن فایل متنی در سی شارپ، روشهای مختلفی وجود دارد. همچنین خواندن فایل متنی به این معناست که خروجی آن فایل، داخل متغیری از نوع string قرار گیرد. این قرارگیری میتواند بهصورت کامل و یا خط به خط داخل یک آرایه انجام شود! قطعهکدهای زیر از فضای نامی using System.IO برای رسیدن به این اهداف استفاده میکنند.
قطعه کد اول: File.ReadAllText
در این جا، متد استاتیک ReadAllText از کلاس File فراخوانی میشود؛ مسیر فایل و نوع انکودینگ خواندن آن را دریافت میکندکه از Encoding نیز برای مقداردهی آن استفاده میشود:
1 |
string text = File.ReadAllText(@"c:\file.txt", Encoding.UTF8); |
قطعه کد دوم: StreamReader.ReadToEnd
متد بالا در واقع ساده شدهی قطعه کدی مشابه زیر است:
1 2 3 4 5 6 |
string text; var fileStream = new FileStream(@"c:\file.txt", FileMode.Open, FileAccess.Read); using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) { text = streamReader.ReadToEnd(); } |
هدف از using در این کد، جایگزینی برای متد Dispose کلاس FileStream است! بدان معنا که using در اینجا مطمئن میشود که این متد فراخوانی شود تا پس از باز شدن فایل و اتمام کار، فایل بسته شود! همچنین هنگام نمونهسازی از این کلاس، در پارامتر سازندهی آن مشخص شده است که برای فایل چه اتفاقی رخ دهد که در اینجا حالت فایل Open یعنی باز شدن و دسترسی آن Read یعنی فقط برای خواندن در نظر گرفته شده است.
قطعه کد سوم: File.ReadAllLines
دو قطعهکد بالا، کل محتوای فایل را داخل یک متغیر رشتهای میخوانند! اما اگر هدف خواندن محتوای فایل متنی داخل یک آرایه باشد، میتوان علاوه بر جدا کردن خروجی قطعهکدهای بالا با علامت خط جدید، بصورت خلاصه از قطعهکد زیر استفاده کرد:
1 |
string[] lines = File.ReadAllLines(@"c:\file.txt", Encoding.UTF8); |
این متد نیز ورودیهایی همانند ReadAllText دریافت میکند.
طبیعتا این کد را بهصورت زیر نیز میتوان نوشت:
1 2 3 4 |
foreach (string line in File.ReadLines(@"c:\file.txt", Encoding.UTF8)) { // process the line } |
حالا بدون آنکه آن را در یک متغیر آرایه قرار دهیم، خط به خط میتوانیم محتوای آن را پردازش کنیم.
قطعه کد چهارم: streamReader.ReadLine
متد بالا شکل خلاصهی قطعهکدی مشابه زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 |
string[] lines; var list = new List<string>(); var fileStream = new FileStream(@"c:\file.txt", FileMode.Open, FileAccess.Read); using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) { string line; while ((line = streamReader.ReadLine()) != null) { list.Add(line); } } lines = list.ToArray(); |
در اینجا آرایهای رشتهای تعریف شده و یک لیست نیز تعریف شده است. از FileStream همانند قبل استفاده شده اما بجای فراخوانی متد ReadToEnd، از متد ReadLine استفاده شده و شرط آن، مخالف null بودن است؛ زیرا null یعنی خطوط به اتمام رسیده است. بنابراین حلقهای با بررسی شرط ReadLine، خط جدید را خوانده و درصورت ایینکه برابر null نباشد، آن را به لیست اضافه میکند و درصورت null بودن نیز حلقه به اتمام میرسد. در نهایت نیز این لیست به کمک متد ToArray به یک آرایه تبدیل میشود و در lines قرار میگیرد.
همچنین بجای اینکه line را به list اضافه کنیم، میتوانیم پردازشهای دلخواه خود را برروی آن انجام دهیم؛ همانند روش قبل. اما تفاوت این است که در اینجا کل متن به یکباره در رم ریخته نمیشود و محتوا به صورت استریم، خط به خط خوانده میشود.
نظرات ثبت شده بدون دیدگاه