PDA

View Full Version : سوال: بافر .: نشان دادن مقدار کپی شدن یه فایل



babak1
پنج شنبه 07 بهمن 1389, 20:57 عصر
سلام:
در برنامه می خوام بدونم که چطور هر بار که وارد حلقه while میشه از ادامه فایل می خونه ؟ و هر دفعه اشیا در داخل حلقه ساخته میشه ؟(قسمت ستاره دار) چرا 1 بار بیرون حلقه ساخته نشده اند ؟




public void fileCopy(string SourceFile, string destinationFile)
{
int numRead;
long fileLength;
FileStream from = new FileStream(SourceFile, FileMode.Open);
FileStream To = new FileStream(destinationFile, FileMode.Create);
byte [] buffer =new byte [1024] ;
fileLength = from.Length;
progressBar1.Minimum = 0;
progressBar1.Maximum = (int)fileLength;

//=====================================
while(fileLength>0)
{
BinaryReader reader = new BinaryReader(from); **
numRead = reader.Read(buffer,0,1024);
fileLength-=numRead;
BinaryWriter writer = new BinaryWriter(To); **
writer.Write(buffer,0,numRead);
progressBar1.Value+=numRead;
writer.Flush();
}
from.Close();
To.Close();
if(progressBar1.Value>99)
{
progressBar1.Value = 0;
MessageBox.Show("the file was copied successfuly");
}

Reza_Yarahmadi
جمعه 08 بهمن 1389, 10:31 صبح
در برنامه می خوام بدونم که چطور هر بار که وارد حلقه while میشه از ادامه فایل می خونه ؟
چون توی حلقه از 2 استریم from و To استفاده میکنید و این 2 استریم بیرون حلقه تعریف و بعد از حلقه بسته میشن. وقتی 1024 بایت از فایل خونده میشه اشاره گر درونی فایل (برای استریم from) روی خونه 1025 قرار میگیره که باعث میشه در اجرای دوم حلقه دستور خوندن فایل ، از خونه 1025 تا 2048 رو بخونه. برای نوشتن هم همین اتفاق میفته.

هر دفعه اشیا در داخل حلقه ساخته میشه ؟(قسمت ستاره دار) چرا 1 بار بیرون حلقه ساخته نشده اند ؟
میشد بیرون حلقه و فقط یکبار تعریفشون کرد ، در این حالت فقط باید مکان اشاره گر رو خودتون هندل کنید و دستور خوندن رو بصورت زیر تغییر بدید

int numRead;
long fileLength;
FileStream from = new FileStream(SourceFile, FileMode.Open);
FileStream To = new FileStream(destinationFile, FileMode.Create);
byte [] buffer =new byte [1024] ;
fileLength = from.Length;
progressBar1.Minimum = 0;
progressBar1.Maximum = (int)fileLength;
BinaryReader reader = new BinaryReader(from);
BinaryWriter writer = new BinaryWriter(To);
int readedLength = 0;

//=====================================
while(fileLength>0)
{
numRead = reader.Read(buffer, readedLength, 1024);
fileLength -= numRead;
writer.Write(buffer, readedLength, numRead);
readedLength += numRead;
progressBar1.Value += numRead;
writer.Flush();
}