ورود

نسخه کامل مشاهده نسخه کامل : کار با فایلها و استریم ها در سی شارپ



yam78
06-04-2007, 11:45
چگونگی کار با فایلها و استریم ها را هر کس سوال داشت در این تاپیک بپرسه

yam78
06-04-2007, 11:55
سوال اول رو خودم می پرسم

فرض کنید یک برنامه خیلی ساده داریم که فقط یک فرم دارد و یک کلاس
تعریف استریم باید در کجا قرار بگیرد؟
چون من هر جا می نویسمش یا ایراد می گیره و یا در مواقع استفاده اسمش رو برام نمی آره


توضیح : در کتاب آقای جعفرنژاد نوشته که استریم ها و متغیرهایی از نوع BinaryFormatter را بعد از عبارت endregion# باید تعریف کرد
ولی من اثری از این کلمه در برنامه ام نمی بینم

someone
06-04-2007, 12:01
سلام.
شما باید از IO Namespace در برنامه استفاده کنین تا بتونین از کلاس های Stream , StreamReader و
StreamWriter استفاده کنین. به این شکل :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

yam78
06-04-2007, 12:04
استفاده کردم... ولی بازم نشد :(

someone
06-04-2007, 19:25
این یه نمونه ی ساده از Stream ها :



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

البته یه برنامه Console هست. فکر نمیکنم نیاز به توضیح داشته باشه.
اگه مشکلی پیش اومد اطلاع بدین.

yam78
06-04-2007, 21:00
ممنون
برنامه جواب داد و تقریباً فهمیدم باید چه کار بکنم

armita.s
07-04-2007, 00:34
من می خواهم برنامه ای بنویسم که عناصر موجود در یک فایل رو تجزیه کنم.(مثل parser ) اما با خوندن از فایل مشکل دارم .( مثلا if _دستور کنترلی) باید ادرس فایل مورد نظر رو به برنامه بدم میشه راهنمایی کنید .اگر امکان داره با یه مثال

yam78
07-04-2007, 01:55
برای خوندن از یک فایل... اگه یک داده string داشته باشیم مثلاً مینویسیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای خوندن یک داده از نوع DateTime باید از چه متدی استفاده کرد؟ متد ReadDateTime که نداره!!

yam78
07-04-2007, 08:52
یک سوال دیگه... برای خوندن همه رکوردهای فایل باید از تابع seek استفاده کنم؟

someone
08-04-2007, 22:41
سلام.



من می خواهم برنامه ای بنویسم که عناصر موجود در یک فایل رو تجزیه کنم.(مثل parser ) اما با خوندن از فایل مشکل دارم .( مثلا if _دستور کنترلی) باید ادرس فایل مورد نظر رو به برنامه بدم میشه راهنمایی کنید .اگر امکان داره با یه مثال


به نمونه بالا مراجعه کنین.



برای خوندن یک داده از نوع DateTime باید از چه متدی استفاده کرد؟ متد ReadDateTime که نداره!!

اطلاعات در یه فایل binary هستند (به طور کلی) کافیه کاراکتر به کاراکتر اطلاعات رو بگیرین.
اگه فایل مورد نظر txt هست به راحتی از ReadLine استفاده کنین.



یک سوال دیگه... برای خوندن همه رکوردهای فایل باید از تابع seek استفاده کنم؟
لزومی نداره. چطور ؟

yam78
09-04-2007, 01:09
اطلاعات در یه فایل binary هستند (به طور کلی) کافیه کاراکتر به کاراکتر اطلاعات رو بگیرین.
اگه فایل مورد نظر txt هست به راحتی از ReadLine استفاده کنین.




لزومی نداره. چطور ؟

1- فایلم باینری هست
حالا یه سوال دیگه پیش اومد ...
اگه فایل txt باشه برای تبدیل string به DateTime باید چه کنم؟
تابع ToDate هم نداره که! یا من بلد نیستم؟

2- پس باید چه کاری بکنم برای گزارشگیری از یک فایل؟

متشکر

someone
10-04-2007, 10:12
دوباره سلام.
میتونین از متود Parse استفاده کنین
به این شکل :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

fariba_gh20
16-04-2007, 10:53
سلام
من ميخوام محتواي جداول بانك اطلاعاتي با Sql را بخونم و بريزم در يك فايل
و بعد ميخوام همون فايلي كه ايجاد كردم اطلاعاتشو بخونم و بريزم داخل جداول بانك اطلاعاتي
امكان اين كار هست ؟

someone
16-04-2007, 14:28
سلام.
دقیقا برعکس همون برنامه باید عمل کنین. البته موردی که براتون گذاشته بودم تنها در مورد یه field هست.
کافیه فایل مورد نظر رو خط به خط جستجو کنین با استفاده از ReadLine.
اگه بانک شما چندین field داره میتونین اطلاعات هر رکورد رو به صورت یه تگ در یه فایل ذخیره کنین .
البته اگه خودتون بخواین میتونین براش یه parser بنویسین.
مثلا :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نمونه بالا قراردادی هست که خودتون ایجاد میکنین. میتونه هر شکلی داشته باشه.
اما یه روش استاندارد به نام CSV وجود داره .تو این روش شما اطلاعات هر field و record رو پست سر هم و
بوسیله " , " از هم جدا میکنین. می تونین از XMLparser هم استفاده کنین.

fariba_gh20
17-04-2007, 19:07
سلام.
دقیقا برعکس همون برنامه باید عمل کنین. البته موردی که براتون گذاشته بودم تنها در مورد یه field هست.
کافیه فایل مورد نظر رو خط به خط جستجو کنین با استفاده از ReadLine.
اگه بانک شما چندین field داره میتونین اطلاعات هر رکورد رو به صورت یه تگ در یه فایل ذخیره کنین .
البته اگه خودتون بخواین میتونین براش یه parser بنویسین.
مثلا :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نمونه بالا قراردادی هست که خودتون ایجاد میکنین. میتونه هر شکلی داشته باشه.
اما یه روش استاندارد به نام CSV وجود داره .تو این روش شما اطلاعات هر field و record رو پست سر هم و
بوسیله " , " از هم جدا میکنین. می تونین از XMLparser هم استفاده کنین.

سلام
ميشه راجب CSV بيشتر برام بگين و اينكه چطوري ميتونم ازش استفاده كنم انكه با كاما جدا بشه خيلي خوبه

hamidreza_buddy
17-04-2007, 20:08
سلام
من ميخوام محتواي جداول بانك اطلاعاتي با Sql را بخونم و بريزم در يك فايل
و بعد ميخوام همون فايلي كه ايجاد كردم اطلاعاتشو بخونم و بريزم داخل جداول بانك اطلاعاتي
امكان اين كار هست ؟

اشیائی از نوع DataTable و DataSet متدهایی دارند با نام های
ReadXml()
ReadXmlSchema()
WriteXml()
WriteXmlSchema()
s
با استفاده از این متدها می توان کل جدول را درون یک فایل xml ذخیره و سپس آن را بازیابی کرد.
البته باید Schema جدول را هم ذخیره کرد تا موقع خواندن مشکلی بوجود نیاید.

برای ذخیره:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

و برای خواندن:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

پس کاری که شما می کنید اینه که جدول را درون یک DataTable بخونید و سپس اون رو بوسیلۀ این متدها ذخیره کنید.

someone
18-04-2007, 19:05
دوباره سلام.
در مورد CSV میتونین Parser پیدا کنین.مثلا :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
البته قبل از بحث در موردش به شما بستگی داره. حمیدرضا مطلبی رو در باره ی XML گذاشتن.
قبلا هم در بارش صحبت کرده بودیم.
یکی از دو موضوع رو انتخاب کنین تا بتونیم بیشتر در موردش صحبت کنیم. (XML بهتر هست.)
چون موضوع خیلی جالبی هست و همین طور پر کاربرد.
و اگه قرار هست این بحث ادامه پیدا کنه ، لطفا در پست زیر دنبالش کنین :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

fariba_gh20
19-04-2007, 22:40
سلام
از ReadXML, WriteXML استفاده كردم و تقريبا كارم حل شد ( ممنون حميدرضا)
فقط 1 مشكل پيش اومد ، اينكه در دو تا از جدولها از Identity استفاده كردم و زماني كه ميخوام
اطلاعات رو داخل جدول بريزم اين اجازه را به من نميده
حتي از دستور SET Identity Table OFF هم استفاده كردم ولي بازم جواب نميده
1 راه حل به من بگيد تا فردا بيشتر وقت ندارم

yam78
30-04-2007, 18:29
دوباره سلام
برای دستیابی به یک رکورد (یعنی همون سرچ) در یک فایل txt و از نوع random access اآیا متد خاصی داریم؟
اگه نه پس چه کار باید بکنیم؟

hamidreza_buddy
30-04-2007, 19:23
دوباره سلام
برای دستیابی به یک رکورد (یعنی همون سرچ) در یک فایل txt و از نوع random access اآیا متد خاصی داریم؟
اگه نه پس چه کار باید بکنیم؟

باید از متد Seek کلاس FileStream استفاده کنیم.
فرض می کنیم فایلی به نام test.dat وجود دارد. با کد زیر آن را باز می کنیم.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


با استفاده از متد Seek می توان به هرجای فایل رفت و آنجا عمل خواندن را انجام داد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این دستور اشاره گر فایل را به بایت 100 فایل می برد.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اشاره گر فایل را به 10 مین باید (از آخر) فایل می برد.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

100 بایت از محل حاضر جلوتر می رود.

برای خواندن یک تعداد بایت هم می توان به صورت زیر عمل کرد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

که 100 بایت را می خواند (از بایت 100 تا 200) و درون آرایه می ریزد. (0 مشخص می کند که از کدام خانۀ آرایه شروع کند به ریختن بایت ها به درون آرایه)

و در آخر هم یادتان نرود که فایل را ببندید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

البته یک روش دیگر هم می توان استفاده کرد:
همۀ فایل را درون آرایه ای از String ها بخوانیم و با آن مثل خطوط فایلمان رفتار کنیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

yam78
18-05-2007, 18:10
با استفاده از متد Seek می توان به هرجای فایل رفت و آنجا عمل خواندن را انجام داد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این دستور اشاره گر فایل را به بایت 100 فایل می برد.




ممنون
ولی من باز هم مشکل دارم...
مثلا فرض کنید یک فایل پرسنلی داریم (ID - نام - نام خانوادگی -...)
کاربر با وارد کردن ID می خواهد به بقیه اطلاعات دسترسی داشته باشد
آنجا که دیگه نمی دونیم این آی دی در کدوم بایت قرار داره!!
باید از اول تا آخر فایل رو seek کنیم؟
یا راه بهتری هم هست؟

hamidreza_buddy
19-05-2007, 17:31
نه.
مجبوریم از اول تا آخر فایل رو چک کنیم.
اگه با مباحث «ذخیره سازی و بازیابی اطلاعات» آشنا باشی می شه این مشکلات رو رفع کرد (بهینه کرد) با استفاده از ساختمان داده هایی مثل B+ Tree ها (درخت های B پلاس).
که دیگه لازم نیست همۀ فایل بررسی بشه و فقط یه قسمتی از فایل بررسی میشه.
اگه واسه درس C هستش از اول تا آخر فایل رو بخون و یکی یکی چک کن.

yam78
21-05-2007, 14:49
واسه همون درس ذخیره می خوام ولی نباید فعلا بهینه باشه... یعنی هنوز به بی پلاس نرسیدیم:)
ممنون از کمکت

yam78
07-06-2007, 07:57
نه.
مجبوریم از اول تا آخر فایل رو چک کنیم.
.


باید از متد Seek کلاس FileStream استفاده کنیم.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این دستور اشاره گر فایل را به بایت 100 فایل می برد.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اشاره گر فایل را به 10 مین باید (از آخر) فایل می برد.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

100 بایت از محل حاضر جلوتر می رود.


[/code]

سلام
با این متد seek چه طوری میشه از اول تا آخر فایل رو خوند؟
ما که نمی دونیم آخر فایل آدرسش چیه؟ یعنی نمی دونیم که فایل چند بایتی هست ؟

yam78
07-06-2007, 10:06
خدایا من هیچی از سی شارپ بلد نیستم:9:

علاوه بر اینکه نمی دونم از متد seek چه زوری استفاده کنم، نمی دونم وقتی به اون نقطه که می خوام رسیدم، چه زوری فیلدهای رکوردم رو بخونم و نمایش بدم...
این کد رو نوشتم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که رفتم دیدم متد Read ، int برمی گردونه... به جای Read باید چی بگذارم؟

در ضمن فیلد های BookName و AuthorName از نوع []char هستند چون می خواستم زول رکورد رو ثابت بگیرم. آیا می تونم به عنوان رشته بخونم یا بنویسم یا باید تبدیل کنم؟ اگه میشه اونوقت باز هم طول رکورد ثابت می مونه؟

دارم می میرم یکی کمک کنه ممنون :11:

eng_a_h_b
12-07-2007, 10:43
سلام می خواستم بدونم با چه کدی میشه ساعت سیستم رو تغییر داد.

hamidreza_buddy
15-07-2007, 09:25
خدایا من هیچی از سی شارپ بلد نیستم:9:

علاوه بر اینکه نمی دونم از متد seek چه زوری استفاده کنم، نمی دونم وقتی به اون نقطه که می خوام رسیدم، چه زوری فیلدهای رکوردم رو بخونم و نمایش بدم...
این کد رو نوشتم


به نظر من براي راحت تر شدن كارت هر كدوم از ركوردارو توي يك خط از فايل بنويس‌(آخر هر ركورد enter بزن)
براي خوندن هم از ReadLine استفاده كن كه اون رشته رو بر مي گردونه.

* متد Read فقط يه كاراكتر بر مي گردونه.

hamidreza_buddy
15-07-2007, 09:31
سلام می خواستم بدونم با چه کدی میشه ساعت سیستم رو تغییر داد.

ابتدا يه كلاس به نام Win32 تعريف مي كنيم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

براي گرفتن زمان/تاريخ سيستم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

براي تغيير دادن زمان سيستم يك شئ Win32 بساز و اون رو با اعداد دلخواه پر كن و بفرست به SetLocalTime() (البته به جاي out از ref استفاده كن)

sami14online
01-07-2011, 22:40
سلام
میدونم این تاپیک متروکه است ولی شاید یکی پیدا شه تا کمکم کنه
من با نحوه ذخیره کردن فایلها مشکل دارم
اینکه چه جوری باید بهش مسیر بدیم تا کجای کامپیوتر ذخیره بشه؟من میخام در کنار فایل exe باشه تا با جابجاییش مشکلی نداشته باشم؟
وقتی اول برنامه اینو میزنم میگه این فایلو نمیتونم پیدا کنم:
string FileName = "H:\\file.dat"
اصلا این دات دت چیه؟
و وقتی هم save file dialog میسازم وقتی سیو میکنم میگه مسیر نال هست.
لطفا راهنماییم کنید.
ممنون