چگونگی کار با فایلها و استریم ها را هر کس سوال داشت در این تاپیک بپرسه
Printable View
چگونگی کار با فایلها و استریم ها را هر کس سوال داشت در این تاپیک بپرسه
سوال اول رو خودم می پرسم
فرض کنید یک برنامه خیلی ساده داریم که فقط یک فرم دارد و یک کلاس
تعریف استریم باید در کجا قرار بگیرد؟
چون من هر جا می نویسمش یا ایراد می گیره و یا در مواقع استفاده اسمش رو برام نمی آره
توضیح : در کتاب آقای جعفرنژاد نوشته که استریم ها و متغیرهایی از نوع BinaryFormatter را بعد از عبارت endregion# باید تعریف کرد
ولی من اثری از این کلمه در برنامه ام نمی بینم
سلام.
شما باید از IO Namespace در برنامه استفاده کنین تا بتونین از کلاس های Stream , StreamReader و
StreamWriter استفاده کنین. به این شکل :
کد:
using System.IO;
استفاده کردم... ولی بازم نشد :(
این یه نمونه ی ساده از Stream ها :
البته یه برنامه Console هست. فکر نمیکنم نیاز به توضیح داشته باشه.کد:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace C_sharp
{
class Program
{
static void Main(string[] args)
{
try
{
using (StreamReader sr =
new StreamReader("c:\\Text.txt"))
{
string line;
while ((line = sr.ReadLine()) != null)
Console.WriteLine(line);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
اگه مشکلی پیش اومد اطلاع بدین.
ممنون
برنامه جواب داد و تقریباً فهمیدم باید چه کار بکنم
من می خواهم برنامه ای بنویسم که عناصر موجود در یک فایل رو تجزیه کنم.(مثل parser ) اما با خوندن از فایل مشکل دارم .( مثلا if _دستور کنترلی) باید ادرس فایل مورد نظر رو به برنامه بدم میشه راهنمایی کنید .اگر امکان داره با یه مثال
برای خوندن از یک فایل... اگه یک داده string داشته باشیم مثلاً مینویسیم:
برای خوندن یک داده از نوع DateTime باید از چه متدی استفاده کرد؟ متد ReadDateTime که نداره!!کد:binaryInput.ReadString();
یک سوال دیگه... برای خوندن همه رکوردهای فایل باید از تابع seek استفاده کنم؟
سلام.
به نمونه بالا مراجعه کنین.نقل قول:
من می خواهم برنامه ای بنویسم که عناصر موجود در یک فایل رو تجزیه کنم.(مثل parser ) اما با خوندن از فایل مشکل دارم .( مثلا if _دستور کنترلی) باید ادرس فایل مورد نظر رو به برنامه بدم میشه راهنمایی کنید .اگر امکان داره با یه مثال
اطلاعات در یه فایل binary هستند (به طور کلی) کافیه کاراکتر به کاراکتر اطلاعات رو بگیرین.نقل قول:
برای خوندن یک داده از نوع DateTime باید از چه متدی استفاده کرد؟ متد ReadDateTime که نداره!!
اگه فایل مورد نظر txt هست به راحتی از ReadLine استفاده کنین.
لزومی نداره. چطور ؟نقل قول:
یک سوال دیگه... برای خوندن همه رکوردهای فایل باید از تابع seek استفاده کنم؟
1- فایلم باینری هستنقل قول:
حالا یه سوال دیگه پیش اومد ...
اگه فایل txt باشه برای تبدیل string به DateTime باید چه کنم؟
تابع ToDate هم نداره که! یا من بلد نیستم؟
2- پس باید چه کاری بکنم برای گزارشگیری از یک فایل؟
متشکر
دوباره سلام.
میتونین از متود Parse استفاده کنین
به این شکل :
کد:
DateTime time = DateTime.Parse(string);
سلام
من ميخوام محتواي جداول بانك اطلاعاتي با Sql را بخونم و بريزم در يك فايل
و بعد ميخوام همون فايلي كه ايجاد كردم اطلاعاتشو بخونم و بريزم داخل جداول بانك اطلاعاتي
امكان اين كار هست ؟
سلام.
دقیقا برعکس همون برنامه باید عمل کنین. البته موردی که براتون گذاشته بودم تنها در مورد یه field هست.
کافیه فایل مورد نظر رو خط به خط جستجو کنین با استفاده از ReadLine.
اگه بانک شما چندین field داره میتونین اطلاعات هر رکورد رو به صورت یه تگ در یه فایل ذخیره کنین .
البته اگه خودتون بخواین میتونین براش یه parser بنویسین.
مثلا :
نمونه بالا قراردادی هست که خودتون ایجاد میکنین. میتونه هر شکلی داشته باشه.کد:
<Name>
name1
name2
name3
</name>
<lastName>
lname1
lname2
lName3
</lname>
اما یه روش استاندارد به نام CSV وجود داره .تو این روش شما اطلاعات هر field و record رو پست سر هم و
بوسیله " , " از هم جدا میکنین. می تونین از XMLparser هم استفاده کنین.
سلامنقل قول:
ميشه راجب CSV بيشتر برام بگين و اينكه چطوري ميتونم ازش استفاده كنم انكه با كاما جدا بشه خيلي خوبه
اشیائی از نوع DataTable و DataSet متدهایی دارند با نام هاینقل قول:
ReadXml()
ReadXmlSchema()
WriteXml()
WriteXmlSchema()
s
با استفاده از این متدها می توان کل جدول را درون یک فایل xml ذخیره و سپس آن را بازیابی کرد.
البته باید Schema جدول را هم ذخیره کرد تا موقع خواندن مشکلی بوجود نیاید.
برای ذخیره:
و برای خواندن:کد:myTable.WriteXmlSchema("myTableSchema.xml");
myTable.WriteXml("myTable.xml");
پس کاری که شما می کنید اینه که جدول را درون یک DataTable بخونید و سپس اون رو بوسیلۀ این متدها ذخیره کنید.کد:myTable.ReadXmlSchema("myTableSchema.xml");
myTable.ReadXml("myTable.xml");
دوباره سلام.
در مورد CSV میتونین Parser پیدا کنین.مثلا :
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
البته قبل از بحث در موردش به شما بستگی داره. حمیدرضا مطلبی رو در باره ی XML گذاشتن.
قبلا هم در بارش صحبت کرده بودیم.
یکی از دو موضوع رو انتخاب کنین تا بتونیم بیشتر در موردش صحبت کنیم. (XML بهتر هست.)
چون موضوع خیلی جالبی هست و همین طور پر کاربرد.
و اگه قرار هست این بحث ادامه پیدا کنه ، لطفا در پست زیر دنبالش کنین :
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سلام
از ReadXML, WriteXML استفاده كردم و تقريبا كارم حل شد ( ممنون حميدرضا)
فقط 1 مشكل پيش اومد ، اينكه در دو تا از جدولها از Identity استفاده كردم و زماني كه ميخوام
اطلاعات رو داخل جدول بريزم اين اجازه را به من نميده
حتي از دستور SET Identity Table OFF هم استفاده كردم ولي بازم جواب نميده
1 راه حل به من بگيد تا فردا بيشتر وقت ندارم
دوباره سلام
برای دستیابی به یک رکورد (یعنی همون سرچ) در یک فایل txt و از نوع random access اآیا متد خاصی داریم؟
اگه نه پس چه کار باید بکنیم؟
باید از متد Seek کلاس FileStream استفاده کنیم.نقل قول:
فرض می کنیم فایلی به نام test.dat وجود دارد. با کد زیر آن را باز می کنیم.
کد:FileStream fs = new FileStream("test.dat",FileMode.Open,
FileAccess.Read,FileShare.Read);
با استفاده از متد Seek می توان به هرجای فایل رفت و آنجا عمل خواندن را انجام داد:
این دستور اشاره گر فایل را به بایت 100 فایل می برد.کد:fs.Seek(100,SeekOrigin.Begin);
اشاره گر فایل را به 10 مین باید (از آخر) فایل می برد.کد:fs.Seek(10,SeekOrigin.End);
100 بایت از محل حاضر جلوتر می رود.کد:fs.Seek(100,SeekOrigin.Current);
برای خواندن یک تعداد بایت هم می توان به صورت زیر عمل کرد:
که 100 بایت را می خواند (از بایت 100 تا 200) و درون آرایه می ریزد. (0 مشخص می کند که از کدام خانۀ آرایه شروع کند به ریختن بایت ها به درون آرایه)کد:byte[] byteArray = new byte[100];
int numBytesRead = fs.Read(byteArray, 0, 100);
و در آخر هم یادتان نرود که فایل را ببندید:
البته یک روش دیگر هم می توان استفاده کرد:کد:fs.Close();
همۀ فایل را درون آرایه ای از String ها بخوانیم و با آن مثل خطوط فایلمان رفتار کنیم:
کد:StreamReader sr = new StreamReader("d:\\passwords.txt");
String pwd = null;
string[] line = new string[10];
for (int i = 0; i < 10; i++)
{
line[i] = sr.ReadLine();
}
int index = 0;
pwd = line[index].ToString();
sr.Close();
نقل قول:
ممنون
ولی من باز هم مشکل دارم...
مثلا فرض کنید یک فایل پرسنلی داریم (ID - نام - نام خانوادگی -...)
کاربر با وارد کردن ID می خواهد به بقیه اطلاعات دسترسی داشته باشد
آنجا که دیگه نمی دونیم این آی دی در کدوم بایت قرار داره!!
باید از اول تا آخر فایل رو seek کنیم؟
یا راه بهتری هم هست؟
نه.
مجبوریم از اول تا آخر فایل رو چک کنیم.
اگه با مباحث «ذخیره سازی و بازیابی اطلاعات» آشنا باشی می شه این مشکلات رو رفع کرد (بهینه کرد) با استفاده از ساختمان داده هایی مثل B+ Tree ها (درخت های B پلاس).
که دیگه لازم نیست همۀ فایل بررسی بشه و فقط یه قسمتی از فایل بررسی میشه.
اگه واسه درس C هستش از اول تا آخر فایل رو بخون و یکی یکی چک کن.
واسه همون درس ذخیره می خوام ولی نباید فعلا بهینه باشه... یعنی هنوز به بی پلاس نرسیدیم:)
ممنون از کمکت
نقل قول:سلامنقل قول:
با این متد seek چه طوری میشه از اول تا آخر فایل رو خوند؟
ما که نمی دونیم آخر فایل آدرسش چیه؟ یعنی نمی دونیم که فایل چند بایتی هست ؟
خدایا من هیچی از سی شارپ بلد نیستم:9:
علاوه بر اینکه نمی دونم از متد seek چه زوری استفاده کنم، نمی دونم وقتی به اون نقطه که می خوام رسیدم، چه زوری فیلدهای رکوردم رو بخونم و نمایش بدم...
این کد رو نوشتم
که رفتم دیدم متد Read ، int برمی گردونه... به جای Read باید چی بگذارم؟کد:fileStream.Seek(???????, SeekOrigin.Begin);
bookrecord.BookNo = reader.Read();
bookrecord.BookName = reader.Read();
bookrecord.AuthorName = reader.Read();
if (bookrecord.BookName != "")
**
textBox7.Text = bookrecord.BookName;
textBox8.Text = bookrecord.AuthorName;
}
else
MessageBox.Show("Record Not Found");
fileStream.Close();
در ضمن فیلد های BookName و AuthorName از نوع []char هستند چون می خواستم زول رکورد رو ثابت بگیرم. آیا می تونم به عنوان رشته بخونم یا بنویسم یا باید تبدیل کنم؟ اگه میشه اونوقت باز هم طول رکورد ثابت می مونه؟
دارم می میرم یکی کمک کنه ممنون :11:
سلام می خواستم بدونم با چه کدی میشه ساعت سیستم رو تغییر داد.
به نظر من براي راحت تر شدن كارت هر كدوم از ركوردارو توي يك خط از فايل بنويس(آخر هر ركورد enter بزن)نقل قول:
براي خوندن هم از ReadLine استفاده كن كه اون رشته رو بر مي گردونه.
* متد Read فقط يه كاراكتر بر مي گردونه.
ابتدا يه كلاس به نام Win32 تعريف مي كنيم:نقل قول:
براي گرفتن زمان/تاريخ سيستم:کد:public class Win32
{
private Win32()
{
}
[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
[MarshalAs(UnmanagedType.U2)]
public short Year;
[MarshalAs(UnmanagedType.U2)]
public short Month;
[MarshalAs(UnmanagedType.U2)]
public short DayOfWeek;
[MarshalAs(UnmanagedType.U2)]
public short Day;
[MarshalAs(UnmanagedType.U2)]
public short Hour;
[MarshalAs(UnmanagedType.U2)]
public short Minute;
[MarshalAs(UnmanagedType.U2)]
public short Second;
[MarshalAs(UnmanagedType.U2)]
public short Milliseconds;
}
[DllImport("kernel32.dll")]
public static extern void GetLocalTime(
out System.SystemTime systemTime);
[DllImport("kernel32.dll")]
public static extern void GetSystemTime(
out System.SystemTime systemTime);
[DllImport("kernel32.dll")]
public static extern bool SetSystemTime(
ref System.SystemTime systemTime);
[DllImport("kernel32.dll")]
public static extern bool SetLocalTime(
ref System.SystemTime systemTime);
}
براي تغيير دادن زمان سيستم يك شئ Win32 بساز و اون رو با اعداد دلخواه پر كن و بفرست به SetLocalTime() (البته به جاي out از ref استفاده كن)کد:Win32.SystemTime sysTime;
if( Win32.GetLocalTime(out sysTime) )
Console.WriteLine("{0}:{1}:{2}", sysTime.Hour, sysTime.Minute,
sysTime.Second);
سلام
میدونم این تاپیک متروکه است ولی شاید یکی پیدا شه تا کمکم کنه
من با نحوه ذخیره کردن فایلها مشکل دارم
اینکه چه جوری باید بهش مسیر بدیم تا کجای کامپیوتر ذخیره بشه؟من میخام در کنار فایل exe باشه تا با جابجاییش مشکلی نداشته باشم؟
وقتی اول برنامه اینو میزنم میگه این فایلو نمیتونم پیدا کنم:
string FileName = "H:\\file.dat"
اصلا این دات دت چیه؟
و وقتی هم save file dialog میسازم وقتی سیو میکنم میگه مسیر نال هست.
لطفا راهنماییم کنید.
ممنون